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