我是一名本科生,想要通过“计划编程语言”作为自学。 这是一个简单的程序,我把它命名为“reciprocal.ss”
(define reciprocal
(lambda (n)
(if(= n 0)
"oops!"
(/ 1 n))))
然后我想加载我的程序:
(load "reciprocal.ss")
它产生了这个错误:
reciprocal.ss:1:0:#%top-interaction:未绑定标识符; 此外,没有#%app语法转换器绑定在:#%top-interaction
我按照书中的说法完成了各个部分。也许我只是犯了一个菜鸟错误。任何见解都将不胜感激。
答案 0 :(得分:2)
由于load
使用eval
,因此在REPL之外使用它通常不起作用 - 出于Namespaces
使用racket/load
可以在这里为您服务:
<强> loader.ss 强>
#lang racket/load
(load "reciprocal.ss")
(display (reciprocal 10))
<强> reciprocal.ss 强>
(define reciprocal
(lambda (n)
(if (= n 0) "oops!"
(/ 1 n))))
在Racket(和整个Scheme)中,有一个比运行外部代码的普通语言更复杂的故事。一般情况下,如果要直接“包含”文件,则应使用import
,当您想要建立模块边界时应使用provide
/ require
,并且应使用{{1当你足够复杂,可以扩展其中任何一个的极限时。
答案 1 :(得分:0)
最简单的方法是不要使用load
。
&#34; reciprocal.ss&#34;制作第一行:
#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中一样有效。这意味着程序的结果取决于加载文件的顺序(如果您使用副作用)。模块系统可以更好地处理这个问题(以及其他事情)。