额,最近又闲得无聊去学Chez Scheme
,接触到库的时候,我有几个疑问
比如,定义库的时候
;; mo.ss
(library (mo (1))
(export x)
(import (rnrs))
(define x 3))
导入的时候发现第三行(import (rnrs))
不加上去就报错,
另外发现有module
这个关键字,不会和library
冲突吗??
还有这个rnrs
到底是啥,为什么我要import
这玩样??
如果我想在一个文件里定义多个模块,对模块命名有需求吗
Scheme
为什么没有作用域运算符,比如在Clojure
中有
(module/function arg)
,在C++
中有namespace::function(arg)
,
Scheme
中导入后直接用function
了,感觉跟C语言一样,是这样吗??
LdBeth
2
直接去看 The Scheme Programming Language 和 Chez 手册。还有 R6RS Revised^6 Report on the Algorithmic Language Scheme 。哪些是标准里有的,哪些是 Chez 自己加的,手册里都有。
rnrs 相当于 C 的 stdlib.h,不 import 当然一堆东西都用不了。别的 Clojure 我不用,但是 Common Lisp 写 package 的时候也要 :import :common-lisp
,没啥特别的
Scheme 用的是 (prefix modulename idname)
使用逻辑是反过来的,不是用 prefix 指定某个 module 里的 id,而是在 import 的时候对指定某个 module 里的 id 全部改名
(library (party)
;; Total exports:
;; make, push, push!, make-party, pop!
(export (rename (balloon:make make)
(balloon:push push))
push!
make-party
(rename (party-pop! pop!)))
(import (rnrs)
(only (stack) make push! pop!) ; not empty!
(prefix (balloons) balloon:))
;; Creates a party as a stack of balloons,
;; starting with two balloons
(define (make-party)
(let ([s (make)]) ; from stack
(push! s (balloon:make 10 10))
(push! s (balloon:make 12 9))
s))
(define (party-pop! p)
(balloon:pop (pop! p))))
LdBeth
5
只要 Chez 的手册内容不更新你就不用管。想要用 r7rs 那就去 Racket,或者 Chicken 或 Guile。顺带 r7rs 是把 r6rs 的很多功能砍掉回滚到 r5rs 再重新设计的,区别很大而且不兼容