racket是可以使用load的,将一个文件当作模块来使用,一个文件里面定义的function在另一个文件中也可以使用。[1]这是官方文档,但是照着写了一下还是会报错。
先创建一个文件place.rkt
:
#lang racket
(define city "Salt Lake City")
(define state "Utah")
(printf "~a, ~a\n" city state)
然后再创建一个文件test.rkt
:
#lang racket
(load "place.rkt")
按照预期,应该会打印:
Salt Lake City, Utah
但是却报错了:
place.rkt:1:0: #%top-interaction: unbound identifier;
also, no #%app syntax transformer is bound in: #%top-interaction
官方文档也解释了如果使用#lang racket
那么test文件确实读不到place.rkt
里面定义的东西,说使用#lang racket/load
可以,但我试了还是不行,再次load的时候虽没有报错,但什么也不显示,定义的变量也用不了。
后来在stackoverflow上找了一个答案[2],把问题解决了。解决办法就是,不使用load,而是使用require
,首先在place.rkt
中添加一行(provide (all-defined-out))
:
#lang racket
(provide (all-defined-out))
(define city "Salt Lake City")
(define state "Utah")
(printf "~a, ~a\n" city state)
然后在test文件中使用:
#lang racket
(require "place.rkt")
city
就可以正常输出结果了:
Salt Lake City, Utah
"Salt Lake City"
[1] https://docs.racket-lang.org/guide/load.html
[2] https://stackoverflow.com/questions/45342053/how-do-i-load-my-file-at-drracket