我知道Lisp和Scheme程序员通常会说eval
除非必要,否则应该避免.我已经看到了几种编程语言的相同建议,但我还没有看到一个反对使用的明确论据列表eval
.我在哪里可以找到使用中潜在问题的说明eval
?
例如,我知道GOTO
程序编程中的问题(使程序难以理解且难以维护,难以找到安全问题等),但我从未见过反对的论点eval
.
有趣的GOTO
是,相反的论点应该对延续有效,但我看到Schemers,例如,不会说延续是"邪恶的" - 你在使用时应该小心.他们更倾向于使用代码而eval
不是代码使用continuation(据我所知 - 我可能是错的).
我有任意数量的列表,我想使用for宏处理.我想创建一个函数,它将向量作为绑定传递,因为列表的数量不同.
如果我硬编码绑定,它按预期工作:
=> (def list1 '("pink" "green"))
=> (def list2 '("dog" "cat"))
=> (for [A list1 B list2] (str A "-" B))
("pink-dog" "pink-cat" "green-dog" "green-cat")
Run Code Online (Sandbox Code Playgroud)
当我尝试单独创建一个向量并使用它作为绑定我遇到了问题.在这里,我手动创建绑定向量:
=> (def testvector (vec (list 'A list1 'B list2)))
Run Code Online (Sandbox Code Playgroud)
这似乎很好:
=> testvector
[A ("pink" "green") B ("dog" "cat")]
=> (class testvector)
clojure.lang.PersistentVector
Run Code Online (Sandbox Code Playgroud)
然而,
=> (for testvector (str A "-" B))
#<CompilerException java.lang.IllegalArgumentException: for requires a vector for its binding (NO_SOURCE_FILE:36)>
Run Code Online (Sandbox Code Playgroud)
我不明白为什么testvector在被用作for的绑定时不被认为是一个向量.抓住吸管,我把testvector放在方括号中,这样可以保持宏的快乐(它看到一个向量)但现在我有一个带有一个元素的向量(即向量中的向量),这不起作用,因为绑定需要成对的名称和集合.
=> (for [testvector] (str A "-" B))
#<CompilerException java.lang.IllegalArgumentException: for requires an …
Run Code Online (Sandbox Code Playgroud)