如何在Clojure函数中返回包含变量值的列表?
在Clojure函数中返回包含变量值的列表
嘿,刚好我对这个问题熟得很!你遇到的问题其实是没搞清楚Clojure里求值规则和列表构造的区别,我给你拆解清楚:
为什么你的写法不对?
- 你试的
(lst val):Clojure里括号的核心作用是调用函数/宏,这里它会把lst当成一个可调用的函数(IFn类型),但显然你把lst当成了普通变量,所以才会报错“lst不是IFn”。 - 你试的
'(lst val):这个是用quote(单引号是简写)阻止了里面内容的求值,所以它只会返回由符号lst和val组成的列表,而不是这两个变量的实际值。
正确的实现方式
最直接且常用的方法是用Clojure内置的list函数,它会接收任意数量的参数,先把每个参数求值,再把结果拼成列表返回:
(defn return-my-list [lst val] (list lst val))
比如你调用(return-my-list 10 "clojure"),就会得到(10 "clojure")——这正是你要的包含变量值的列表。
其他可选方法
如果你喜欢用语法糖,也可以用反引号+取消引用的方式(这种方式更常用于宏场景,日常用list更直观):
(defn return-my-list [lst val] `(~lst ~val))
这里的反引号()是quote的增强形式,~`用来取消单个符号的求值,让`lst`和`val`被计算成实际值,再组成列表。
另外,如果你需要构造更长的列表,list函数同样适用,比如(list a b c d)会返回包含a、b、c、d变量值的列表。
内容的提问来源于stack exchange,提问作者saga
相关产品推荐
相关产品推荐

