命名空间如何在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
发生冲突。但是我不知道如何在不重命名我的功能的情况下避免这种情况。
答案 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
是一个糟糕的主意。