【发布时间】:2011-09-09 06:13:21
【问题描述】:
我期望下面我应该能够通过符号函数间接调用我的函数平方,但它不起作用。我在这里做错了什么:
user=> (defn squared [x] (* x x))
#'user/squared
user=> (squared 2)
4
user=> ((symbol "squared") 2)
nil
user=> ((symbol "user" "squared") 2)
nil
user=>
【问题讨论】:
-
除了代码的基本问题(希望我的回答能解决)之外,如果您愿意详细说明,我对您正在解决的问题有点好奇。 .?
-
它有点像兔子洞,我是一个完全的新手......但基本上我遇到了“无法获取宏的价值”,因为我正在做类似
(a :b c & d)其中 a 和 c 都是宏。我希望如果我将其切换为(a :b :c & d)然后将 :c 转换为符号它将起作用。我觉得这实际上是完全错误的,但由于我对((symbol "squared") 2)的小想法没有用,我想我会问它是如何工作的...... -
如果您在
(a :b c & d)表单中遇到此类错误,则很可能a会生成一个扩展,其中包括c在非操作员位置逐字逐句。如果您只想在扩展中包含c宏的名称(而您传递给a的实际内容是宏c的符号名称),那么您只需在扩展中添加一个引号,以便您在适当的位置返回'c而不是c。如果你真的想调用c宏,你需要确保它最终被插入到a产生的扩展中的操作符位置。 -
实际上我真正想做的是编写一些宏,它采用
(defmacro [x] ...),我知道x 是像(f a b c)这样的形式,我想将其转换为(fn [n] (f n a b c))。但我不确定这是否可能,或者如果可能的话,我什至不确定如何开始。如果您想尝试一下,我觉得我应该提出一个新问题。 -
(defmacro transform [[f & args]] (fn [n#] (~f n# ~@args)))应该可以工作。
标签: clojure