所以我是Scheme的新手。我正在尝试使用 ((name: name) (args: args) (body: body)) 形式的规范创建一个定义全局函数的函数,例如
(fn-maker '((name: mult5) (x) (* x 5)))
会让它变得如此全球化,我可以打电话
(mult5 3)
并得到 15。
这是我到目前为止所拥有的:
(define (fn-maker fn-spec)
(let* (spec (map cdr fn-spec))
(name (caar spec))
(args (cadr fn-spec))
(body (caaddr (cdaddr fn-spec))))
(lambda (args)
body)))
我目前主要困惑的是如何让 lambda 使用这些参数。就目前而言,lambda 创建了一个名为“args”的新局部变量,而不是评估 args 后面的列表。有没有解决的办法?我目前的思考过程是,我应该在 args 提供的列表中使用某种形式的 let,但我不确定它会是什么样子,甚至不确定如何构建它。
这是家庭作业,所以我绝对不是在寻找代码(作弊和所有这些),而是寻找正确方向的一点和一些批评。谢谢你。
更新:对于将来发生这种情况的任何人,可以使用一些巧妙的引用非常简单地执行此代码。不需要宏。此外,事实证明,Pretty Big 中的 eval 默认情况下会在全局范围内进行评估。