如何在DrRacket

时间:2017-07-27 05:28:31

标签: scheme racket

我是一名本科生,想要通过“计划编程语言”作为自学。 这是一个简单的程序,我把它命名为“reciprocal.ss”

(define reciprocal
(lambda (n)
(if(= n 0)
   "oops!"
   (/ 1 n))))

然后我想加载我的程序:

(load "reciprocal.ss")

它产生了这个错误:

  

reciprocal.ss:1:0:#%top-interaction:未绑定标识符;   此外,没有#%app语法转换器绑定在:#%top-interaction

我按照书中的说法完成了各个部分。也许我只是犯了一个菜鸟错误。任何见解都将不胜感激。

2 个答案:

答案 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中一样有效。这意味着程序的结果取决于加载文件的顺序(如果您使用副作用)。模块系统可以更好地处理这个问题(以及其他事情)。