Pyret 编程语言:探索脚本语言和函数式编程的融合

开发 后端
Pyret 是一门基于 JavaScript 的脚本语言,旨在成为编程教育的绝佳选择,同时探索脚本语言和函数式编程的融合。目前 Pyret 正处于积极设计和开发阶段,开发者可以自由使用或对其进行修改。

Pyret 是一门基于 JavaScript 的脚本语言,旨在成为编程教育的绝佳选择,同时探索脚本语言和函数式编程的融合。目前 Pyret 正处于积极设计和开发阶段,开发者可以自由使用或对其进行修改。

Pyret 语法介绍

Pyret 具有受 Python 启发的函数、列表和运算符语法,其迭代结构 (Iteration constructs) 的设计为了调用其他语言中的迭代结构。 

  1. fun to-celsius(f): 
  2.   (f - 32) * (5 / 9) 
  3. end 
  4.  
  5. for each(str from [list: "Ahoy""world!"]): 
  6.   print(str) 
  7. end 

Pyret 支持简洁、富有表现力、递归的数据声明,支持可选的类型注释,支持增量添加,以满足各种教学风格和课程需求。 

  1. data BinTree: 
  2.   | leaf 
  3.   | node(value, left :: BinTree, right :: BinTree) 
  4. end 

Pyret 的测试是编程过程的自然组成部分。函数可以在where:子句中结束,该子句为函数提供了单元测试,并且这些断言 (Assertions) 会被动态检查。 

  1. fun sum(l): 
  2.   cases (List) l: 
  3.     | empty => 0 
  4.     | link(first, rest) => first + sum(rest) 
  5.   end 
  6. where
  7.   sum([list: ]) is 0 
  8.   sum([list: 1, 2, 3]) is 6 
  9. end 

对于缩进的问题,Pyret 团队认为缩进对于代码的可读性至关重要,但他们不希望通过程序的空格来确定其含义。相反,程序的含义应该决定它的缩进结构。缩进只是另一个上下文敏感的规则。

明确的语法(Pyret 使用显式end分隔符的原因)意味着开发者可以从电子邮件或 Web 复制和粘贴代码,而不会改变其含义。IDE 会帮助开发者重新缩进代码,无需担心这样做会改变程序的含义。

亮点

注解 (Annotations)

与大多数脚本编程语言不一样,Pyret 支持开箱即用地检查参数上的注解。

Python 

  1. def square(n : int) -> int
  2.   return n * n 
  3. square("5"
  4. # Error at multiplication: 
  5. # Can't multiply sequence by 
  6. # non-int of type 'str' 

Pyret 

  1. fun square(n :: Number) -> Number: 
  2.   n * n 
  3. end 
  4. square("5"
  5. With type checker off
  6. # The Number annotation was not 
  7. # satisfied by the value "5" 
  8.  
  9. With type checker on
  10. # Number is incompatible with String 

支持长度较长的数字类型

Java 

  1. // this is not true 
  2. ((1 / 3) * 3) == 1 

Pyret 

  1. # this is true 
  2. ((1 / 3) * 3) == 1 

结构化数据

Pyret 为编写数据定义提供了优雅的机制,而无需开发者具备对类的认知背景,以及语法开销。

Python 

  1. class BinTree: 
  2.   pass 
  3. class leaf(BinTree): 
  4.   def __init__(self): 
  5.     pass 
  6. class node(BinTree): 
  7.   def __init__(self, v, l, r): 
  8.     self.v = v 
  9.     self.l = l 
  10.     self.r = r 

Pyret 

  1. data BinTree: 
  2.   | leaf 
  3.   | node(v, l, r) 
  4. end 

Pyret 在使用结构化数据方面也非常灵活,并在其底层公开了一个简单的对象模式,支持结构化代码与更多 nominal 模式搭配使用。

OCaml 

  1. type animal = 
  2.   | Elephant of string * float 
  3.   | Tiger of string * float 
  4.   | Horse of string * int 
  5.   ... 
  6.  
  7. let name_of_animal a = 
  8.   match a with 
  9.     | Elephant(name, _) 
  10.     | Tiger(name, _) 
  11.     | Horse(name, _) -> name 
  12.     ... 

Pyret 

  1. data Animal: 
  2.   | elephant(name, weight) 
  3.   | tiger(name, stripes) 
  4.   | horse(name, races-won) 
  5.   ... 
  6. end 
  7.  
  8. fun animal-name(a :: Animal): 
  9.   a.name 
  10. end 

Racket 

  1. (struct elephant (name weight)) 
  2. (struct tiger (name stripes)) 
  3. (struct horse (name races-won)) 
  4. ... 
  5.  
  6. (define (animal-name a) 
  7.   (cond 
  8.     [(elephant? a) (elephant-name a)] 
  9.     [(tiger? a) (tiger-name a)] 
  10.     [(horse? a) (horse-name a)] 
  11.     ...)) 

Pyret 

  1. data Animal: 
  2.   | elephant(name, weight) 
  3.   | tiger(name, stripes) 
  4.   | horse(name, races-won) 
  5.   ... 
  6. end 
  7.  
  8. fun animal-name(a :: Animal): 
  9.   a.name 
  10. end 

运行 Pyret

通过访问 code.pyret.org 直接在浏览器中运行 Pyret,这是最简单的入门方法。查看导览以了解小部分程序和语法示例。

如果希望在命令行中在使用 Pyret 进行编程,需要从 https://www.npmjs.com/package/pyret-npm 安装pyret-npm,安装命令如下:

  1. npm install -g pyret-npm 

根据 Pyret 的官网介绍,目前该项目正在积极开发三个非常重要的功能:

  • 支持静态类型,提供带有标签联合 (tagged unions) 和类型检查器的传统类型系统
  • 使用表作为存储现实世界数据的关键类型
  • 交互式计算模型基于 “world” model

其团队认为 Pyret 也已经足够成熟,因为它实现了自托管编译器。这意味着,当开发者在浏览器中运行 Pyret 时,它会加载实现了 Pyret-to-JavaScript 编译器的 JavaScript 代码(即开发者输入的 Pyret 代码会编译成 JavaScript 并在浏览器中运行)。这个编译器是由 Pyret-to-JavaScript 编译器通过编译 Pyret-to-JavaScript 编译器产生的。

本文转自OSCHINA

本文标题:Pyret 编程语言:探索脚本语言和函数式编程的融合

本文地址:https://www.oschina.net/news/156822/pyret-language

 

责任编辑:未丽燕 来源: 开源中国
相关推荐

2011-08-16 10:03:45

Groovy编程语言Web

2011-08-16 10:37:07

Web

2013-08-01 09:33:52

编程语言胖手编程编程姿势

2013-08-01 09:08:21

编程语言

2009-04-09 11:44:18

编程语言排行榜脚本语言

2011-06-09 09:52:41

F#

2017-11-13 10:46:24

编程语言排行榜脚本语言

2024-04-02 08:00:00

函数式编程开发

2019-12-06 17:40:39

程序员编程语言JavaScript

2022-09-16 07:32:15

编程计算机命令

2009-06-10 08:41:15

Linux脚本语言

2009-06-22 13:43:01

F#函数式编程

2011-08-22 18:00:53

Lua语言

2010-03-19 09:39:17

Python编程语言

2010-02-24 14:04:32

Python脚本语言

2012-09-28 13:23:43

编程语言语言进化程序员

2009-11-09 17:51:51

F#函数式编程

2021-01-13 10:40:42

编程语言PLCGraph

2021-05-28 05:34:06

Golang语言编程

2011-08-25 10:40:21

Lua游戏
点赞
收藏

51CTO技术栈公众号