DrRacket使用load報錯

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章