Chicken Scheme中的命名空间

时间:2015-03-04 15:16:53

标签: namespaces scheme chicken-scheme

命名空间如何在Chicken Scheme中运行?我现在正在使用parley蛋,当我定义一个具有名称的函数时,例如read,由于名称冲突而导致错误(实际上,因为我的read会覆盖parley自己的read,并且会使用错误的类型调用它。

以下是代码:

(use parley)

(define (read p) p) ; This `read` function conflicts.

(let loop ((l (parley "> ")))
  (if (or (eof-object? l)
          (equal? l "quit"))
    (print "bye!")
    (begin
      (printf "you typed: ~s~%" l)
      (loop (parley "> ")))))

如何避免像这样的碰撞?

更新

我减少了重现此代码所需的代码:

(use parley)
(define (read p) p)

这会出现以下错误: Error: illegal non-atomic object: #<input port "readline.scm">

显然,我的read功能与parley read发生冲突。但是我不知道如何在不重命名我的功能的情况下避免这种情况。

2 个答案:

答案 0 :(得分:5)

根据the documentation,您可以使用与在模块中导入模块时相同的技巧。然后你有很多选择,比如前缀:

(use (prefix parley parley:)) ; all imported symbols have been prefixed with "parley:"

答案 1 :(得分:1)

不是那么明显。事实证明,read是Scheme中的一个基本功能,它将Scheme对象的外部表示转换为对象本身。覆盖它不是一个好主意,因为我的库或应用程序的用户可能认为read没有被覆盖,并尝试将其用作解析器。

但是Chicken Scheme应该发出警告,而不是错误,所以这可能是Chicken中的一个错误。要确定它是否真的是csi那个错误的人,而不是Parley。 / p>

无论如何,覆盖read是一个糟糕的主意。