Lisp

[Racket] racket模块

2016-03-03  本文已影响273人  何幻

DrRacket分为上下两块,上面的称为definitions area,下面的称为interactions area。
racket语言支持两种等价方式定义模块,#langmodule
#lang racket(module module1 racket …,表示将racket模块中的所有绑定都导入当前模块。
这些初始化绑定决定了哪些符号在模块中是可用的,称为module language。

1. 用#lang,导入模块

(1)1.rkt

#lang racket

(provide add1)

(define (add1 x)
    (+ x 1))

(2)定义区

#lang racket

(require (file "C:/Users/thzt/Desktop/test/1.rkt"))

(3)交互区

> (add1 2)
3

2. 用module导入模块

(1)1.rkt

(module module1 racket
    (provide add1)
    
    (define (add1 x)
    (+ x 1)))

(2)定义区

(module module2 racket
  (require (file "C:/Users/thzt/Desktop/test/1.rkt")))

(3)交互区

> (add1 2)
3

3. 定义lambda演算模块

(1)1.rkt

(module lambda-calculus racket
    (provide (rename-out [1-arg-lambda lambda]
            [1-arg-app #%app]
            [1-form-module-begin #%module-begin]
            [no-literals #%datum]
            [unbound-as-quoted #%top]))
    
    (define-syntax-rule (1-arg-lambda (x) expr)
        (lambda (x) expr))
    
    (define-syntax-rule (1-arg-app e1 e2)
        (#%app e1 e2))
        
    (define-syntax-rule (1-form-module-begin e)
        (#%module-begin e))
        
    (define-syntax (no-literals stx)
        (raise-syntax-error #f "no" stx))
        
    (define-syntax-rule (unbound-as-quoted . id)
        'id))

(2)定义区

#lang racket

(require (file "C:/Users/thzt/Desktop/test/1.rkt"))

(3)交互区

> ((lambda (x) (x z))
   (lambda (y) y))
'z

注:
(1)模块可以使用provideall-from-outexcept-outrename-out来控制模块的输出。
(2)#%app#%module-begin#%datum#%top是racket模块隐含提供的。
#%module-begin在定义模块时,会在模块主体上隐含调用。
(必须被导出,否则使用该模块的模块将不能成为一个合法的module了。)
#%app隐含用于函数调用。
#%datum用于字面量。
#%top用于那些没有绑定的标识符。
(3)上面的例子通过重命名这些隐含绑定,定义了lambda-calculus模块。

上一篇 下一篇

猜你喜欢

热点阅读