[Chez Scheme学习疑问] rnrs到底是啥,怎么引入模块...

额,最近又闲得无聊去学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语言一样,是这样吗??

直接去看 The Scheme Programming Language 和 Chez 手册。还有 R6RS http://www.r6rs.org/final/html/r6rs/r6rs-Z-H-10.html#node_chap_7 。哪些是标准里有的,哪些是 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))))

蟹蟹大佬 :grin:

顺便问一下,他们还有更新吗

只要 Chez 的手册内容不更新你就不用管。想要用 r7rs 那就去 Racket,或者 Chicken 或 Guile。顺带 r7rs 是把 r6rs 的很多功能砍掉回滚到 r5rs 再重新设计的,区别很大而且不兼容