如何在 DrRacket 加载我的文件

问题描述 投票:0回答:3

我是一名本科生,想要自学《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

我按照书上说的做了每个部分。也许我只是犯了一个菜鸟错误。任何见解将不胜感激。

scheme racket
3个回答
4
投票

由于

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
。突破两者的极限。


2
投票

最简单的方法是根本不使用

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


0
投票

谢谢@陈蔚然的询问。

感谢@zetavolt 的“#langracket/load”方法 - 它对我来说效果很好:-)

我真诚地感谢@soegaard 的“要求”方法 - 这效果最好!

再次谢谢大家...CK

© www.soinside.com 2019 - 2024. All rights reserved.