3

命名空间如何在 Chicken Scheme 中工作?我现在正在使用parleyegg,当我定义一个名为 eg 的函数时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. 但我不知道如何在不重命名函数的情况下避免这种情况。

4

2 回答 2

5

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

(use (prefix parley parley:)) ; all imported symbols have been prefixed with "parley:"
于 2015-03-04T16:49:07.520 回答
1

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

但是Chicken Scheme应该给出警告,而不是错误,所以这可能是Chicken中的一个错误。有待确定是否真的是csi错误的人,而不是Parley。

无论如何,覆盖read.

于 2015-03-05T13:19:27.563 回答