【发布时间】:2013-02-11 23:42:57
【问题描述】:
所以我是 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 默认情况下会在全局范围内进行计算。
【问题讨论】:
-
说明书是否规定了您可以使用或不可以使用哪些功能或特殊形式? fn-maker 真的应该是一个函数吗,例如,您可以将它传递给 apply 或 map 吗? (如果后者是真的,我不知道如何在不使用 eval 的情况下做到这一点。)
-
另外,在另一个问题上也有一些相关的讨论:stackoverflow.com/questions/1894610/…
-
对于规则,测试程序将调用 (fn-maker fn-spec) 后跟 (whatever-the-name-was some-args) 形式。我们不允许使用 set!和朋友或任何显式循环函数(递归是可以的)。
标签: functional-programming scheme variadic-functions