我知道Lisp和Scheme程序员通常会说eval除非必要,否则应该避免.我已经看到了几种编程语言的相同建议,但我还没有看到一个反对使用的明确论据列表eval.我在哪里可以找到使用中潜在问题的说明eval?
例如,我知道GOTO程序编程中的问题(使程序难以理解且难以维护,难以找到安全问题等),但我从未见过反对的论点eval.
有趣的GOTO是,相反的论点应该对延续有效,但我看到Schemers,例如,不会说延续是"邪恶的" - 你在使用时应该小心.他们更倾向于使用代码而eval不是代码使用continuation(据我所知 - 我可能是错的).
我在球拍和麻省理工学院计划中尝试使用以下代码,让我惊讶的是编译器错误
(foldr and #t '(#t #t #f))
Run Code Online (Sandbox Code Playgroud)
有没有办法使用reduce/fold方式来检查列表是否只包含true或false?我知道lambda可以完成这项工作,但它确实让我们想知道为什么这不是一个有效的代码.我记得我可以在Haskell中做到.....
TIA.
我正在尝试将列表传递给宏,例如:
(defmacro print-lst (lst)
`(progn
,@(mapcar #'(lambda (x) `(print ,x)) lst)))
(let ((lst '(1 2 3)))
(print-lst lst))
Run Code Online (Sandbox Code Playgroud)
它发现错误:"LST值不是LST类型".
所以,我的问题是,这段代码有什么问题以及如何将列表传递给宏?