这似乎是一个简单的问题;也许它是如此简单,以至于很难找到可以找到答案的搜索。在 Scheme 中(特别是 Guile 实现,如果这有什么不同的话)我如何评估已引用的内容?
这就是我想要做的。
我基本上需要确保我定义的函数按特定顺序评估其参数,因为评估一个参数引起的副作用取决于评估其他参数的过程。但是,Scheme 说参数可以按任何顺序进行评估,所以我想通过引用参数来手动强制它,然后按需要的顺序手动评估它们。
看来“eval”应该做我想做的事,但它有两个问题:
- 不鼓励使用它,所以我觉得应该有更好的方法来完成我想要在这里做的事情。
- 在 Scheme 中,eval 似乎采用了第二个参数,即环境。这让我很困惑。我希望它在语句出现的同一环境中进行评估,那么为什么我需要第二个参数?这甚至可能吗?我玩过 eval ,似乎有些实现需要不同的参数(例如 mit-scheme 甚至不知道 (interaction-environment) 是什么!!!)
我尝试了其他技巧,例如构建 lambda:
(list 'lambda '() '(car (b c)))
但似乎必须对此进行评估以生成程序。我也试过:
(list lambda '() '(car (b c)))
但这会返回一个“原始内置宏”,它也不起作用。
编辑:看起来宏将用于控制评估顺序:(defmacro test1 (ab) `(begin ,b ,a))