调用一个外国程序在scheme中的当前程序中执行工作



我想知道是否允许您调用您制作的另一个程序来在您即将在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
> 

最新更新