如何在DrRacket中加载我的文件

5

我是一名本科生,希望可以通过自学了解"The Scheme programming language"。这里有一个简单的程序,我将其命名为"reciprocal.ss"。

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

接下来我想要加载我的程序:

(load "reciprocal.ss")

它产生了这个错误:

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

我按照书上的说明完成了每个部分。也许我只是犯了初学者的错误。任何见解都将不胜感激。


你用什么编程语言? #lang racket#!r5rs#!r6rs - Sylwester
2个回答

4

由于 load 使用 eval,因此在 REPL 之外使用它通常不起作用,这是由 名称空间 中所述的原因。

在此情况下,使用 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。如果您足够高级并且需要突破限制,可以使用load


抱歉,当我尝试运行文件“loader.ss”时,单词“reciprocal”未定义... - Weiran Chen
@WeiranChen 我刚刚直接发布了这两个文件,并使用 racket loader.ss 运行,得到了 1/10。确保文件中没有其他内容,并且它们在同一个目录中。如果仍然不起作用,请发布你的 Racket 版本。 - zetavolt
仍然无法工作。"reciprocal"未定义。我的DrRacket版本为6.9 [3m]。很抱歉再次打扰您。我将尝试自己找出问题所在。也许我的DrRacket出了一些问题。 - Weiran Chen

2
最简单的方法是根本不使用load
在"reciprocal.ss"中,将第一行改为:
#lang racket
(provide (all-defined-out))
(define reciprocal
  (lambda (n)
    (if (= n 0)
      "oops!"
      (/ 1 n))))

然后在需要使用函数reciprocal的文件中使用(require "reciprocal.ss")

load机制是在模块系统出现之前使用的。编写(load "foo.ss")基本上就像你手动将foo.ss的内容粘贴到repl中并执行一样。这意味着你的程序的结果取决于加载文件的顺序(如果您使用了副作用)。模块系统可以更好地处理这个问题(以及其他问题)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接