我想知道是否允许您调用您制作的另一个程序来在您即将在scheme中制作的新程序中工作,或者我是否必须复制并粘贴上一个程序中的所有代码,尽管我可以做到这一点并使我的生活变得简单,但我想知道在scheme r5rs中是否有更复杂、更优雅的导入方式。
;; Here is an example of what I mean
;; for example I have a file name add.scm which adds 2 numbers
;; now I want to make a new function that squares the numbers
;;is there a way I can do something like this
#lang add.scm as add
;;and use it here like so
(define (square x)
(* x x))
(square add)
;;where add already returns a value
这可能看起来是一段愚蠢的代码,但这是我能给出的最好的pesudo代码,如果这个例子需要更多的编辑才能理解,请告诉我,谢谢。
如果我理解你的问题,你有一个名为add.scm
:的模块
;; add.scm
#lang racket
(+ 5 7) ;; prints 12 when run
并且您想要编写一个新的模块,该模块获取add.scm
模块打印出的值,将其绑定到一个变量,并在计算中使用它,如下所示:
;; square.scm
#lang racket
(??? add ??? "add.scm" ???) ;; bind `add` to "value" of "add.scm" module
(* add add) ;; prints 144 when run
不,没有简单的方法。通过使用dynamic-require
或子流程运行模块,捕获输出,然后用read
获取值,这是可能的,但这是一种糟糕、复杂、脆弱的做事方式。
在Racket中,更好的方法是add.rkt
定义和导出变量,并具有打印值的main
子模块:
;; add.rkt
#lang racket
(provide x)
(define x (+ 5 7))
(module+ main
x)
然后,您可以使用另一个模块中的(require "add.rkt")
来获得用于计算的x
,如果您将add.rkt
作为程序运行(例如,使用racket add.rkt
(,则它会打印值。
Racket(如问题中所述具有#lang
,如另一个答案中所解释的具有module
/provide
/require
(不是Scheme(更不用说R5RS(。
在R6RS方案中,方案源可以分为库文件和顶层程序
如果文件add-library.scm包含:
(library (add-library)
(export add)
(import (rnrs))
(define add (+ 5 7)) )
和add-toplevel.scm包含:
(import (add-library))
(define (square x)
(* x x))
(display (square add))
然后:
$ scheme
> (load "add-toplevel.scm")
144
>