球拍简易AE定义型

Car*_*ngo 3 racket

从第6页的"编程语言:应用程序和解释"一书中,我尝试编写DrRacket中的第一个示例

#lang typed/racket

(define-type AE
 [num (n number?)]
 [add (lhs AE?) (rhs AE?)]
 [sub (lhs AE?) (rhs AE?)])
Run Code Online (Sandbox Code Playgroud)

但是我得到了错误

aeinterpretter.rkt:5:2: define-type: unexpected term in: (add (lhs AE?) (rhs AE?))
Run Code Online (Sandbox Code Playgroud)

我在这做错了什么?

Asu*_*awa 7

您应该使用PLAI语言运行此示例:

#lang plai

(define-type AE
 [num (n number?)]
 [add (lhs AE?) (rhs AE?)]
 [sub (lhs AE?) (rhs AE?)])
Run Code Online (Sandbox Code Playgroud)

类型化的球拍语言是一种完全不同的语言,为您提供最基础球拍语言的力量,但有一个静态类型系统.define-typePLAI中的形式是"类型"的不同概念.

  • `number?`和`AE?`是*谓词*,即检查某些属性的函数(在这种情况下"是一个数字","是一个AE").这是传统Racket继承自Scheme的传统.例如,在REPL中尝试`(数字?5)`,`(数字?#t)`.我不记得它是否在书中,而是[PLAI网站]上的"获取软件"部分(http://www.cs.brown.edu/~sk/Publications/Books/ProgLangs/2007-04 -26 /)解释了如何运行书中的程序. (2认同)
  • JFYI,这本书和课程计划最终转向使用类型而不仅仅是谓词.我一直在教这样一个PLAI变体课程,这可能也是你得到那个打字球拍参考的地方. (2认同)