我是一名本科生,想要自学《TheScheme编程语言》。 这是一个简单的程序,我将其命名为“reciprocal.ss”
(define reciprocal
(lambda (n)
(if(= n 0)
"oops!"
(/ 1 n))))
然后我想加载我的程序:
(load "reciprocal.ss")
它产生这个错误:
reciprocal.ss:1:0: #%top-interaction: 未绑定标识符; 另外,没有 #%app 语法转换器绑定在:#%top-interaction
我按照书上说的做了每个部分。也许我只是犯了一个菜鸟错误。任何见解将不胜感激。
load
使用 eval
,在 REPL 之外使用它通常不起作用 - 原因在 Namespaces 中描述
racket/load
可以在这里为您工作:
loader.ss
#lang racket/load
(load "reciprocal.ss")
(display (reciprocal 10))
倒数.ss
(define reciprocal
(lambda (n)
(if (= n 0) "oops!"
(/ 1 n))))
Racket(以及整个Scheme)在运行外部代码方面比普通语言有更复杂的故事。一般来说,当你想直接“包含”一个文件时,你应该使用
import
;当你想建立模块边界时,你应该使用 provide
/require
;当你足够成熟时,你应该使用 load
。突破两者的极限。
最简单的方法是根本不使用
load
。
在“reciprocal.ss”中写入第一行:
#lang racket
(provide (all-defined-out))
(define reciprocal
(lambda (n)
(if (= n 0)
"oops!"
(/ 1 n))))
然后在需要使用函数
(require "reciprocal.ss")
的文件中使用reciprocal
。
load
机制早在模块系统出现之前的美好时光就被使用过。编写 (load "foo.ss")
基本上就像您手动将 foo.ss
的内容粘贴到 repl 中并执行它一样。这意味着程序的结果取决于加载文件的顺序(如果您使用副作用)。模块系统可以更好地处理这个问题(以及其他事情)。
谢谢@陈蔚然的询问。
感谢@zetavolt 的“#langracket/load”方法 - 它对我来说效果很好:-)
我真诚地感谢@soegaard 的“要求”方法 - 这效果最好!
再次谢谢大家...CK