我有一个简单的clojure语法问题(bc我是该语言的新手)。对于这两个例子,我有一个列表(1 2 3 4):
在Lisp中我可以写:=>`(列表中的第一个是,(第一个)) (列表中的第一个是1)
在Clojure中,如果我写同样的东西(用〜的语言翻译,就像我在某处读到的那样),我得到:
=>'(列表的第一个是〜(第一个)) (列表的第一个是(clojure.core / unquote(first lst)))
我希望我能在Clojure中做我想做的事情,而且我的语法错误。我找到的所有例子都有函数优先使用`(反引号)。我不想打电话给像:
这样的功能`(my-function~(first lst))
我只想返回'(某些列表,(第一个)替换它)
我可以在Clojure中做这样的事吗?
编辑:我给出了一个很糟糕的例子,因为我的ACTUAL问题处理了字符串。让我尝试另一个例子......=>(def color-lst'(红绿蓝))
我想要回归的是:
我看到了所有奇怪的回报。另一种方法是=>`(我想要的颜色是〜(第一个颜色))
=>(格式“我想要的颜色是%s”(第一个颜色 - ))
这就是我解决问题的方法。
答案 0 :(得分:4)
即使您的问题得到解决,CL和Clojure之间也存在一些基本的区别,值得一提:
关于CL和Clojure之间反引号中符号的主要区别在于,Clojure可以解析quasiquoted符号;产生一个名称空间限定符号(看一下Clojure文档的reader section):
user> `foo
user/foo
所以,在CL:
CL-USER> (let ((list '(foo bar baz)))
`(first is ,(first list)))
(FIRST IS FOO)
但是在Clojure中:
user> (let [lst '(foo bar baz)]
`(first is ~(first lst)))
(clojure.core/first user/is foo)
为了在Clojure中获得一个不合格的符号(在反引号内),你必须使用这样的东西:
user> `~'foo
foo
因此,要获得与CL版本相同的结果(忽略readtable-case),您必须使用:
user> (let [lst '(foo bar baz)]
`(~'first ~'is ~(first lst)))
(first is foo)
答案 1 :(得分:2)
对我来说,有点不清楚你的代码中的“列表中的第一个”是什么意思:
'(first of list is ,(first lst))
但是如果你的意思是只是列表开头的占位符,那么以下应该可以正常工作(确保使用反引号!):
`(1 2 3 ~(first [1 2]))
=> (1 2 3 1)
或者,使用引号会产生以下结果(这似乎是您的问题):
'(1 2 3 ~(first [1 2]))
=> (1 2 3 (clojure.core/unquote (first [1 2])))
答案 2 :(得分:0)
(形成“列表中的第一个是%d”(第一个))我想要的是什么。
我认为这部分是我在问题描述中的错,我举了个坏榜样。似乎问题出现了,我在列表中使用字符串(可能是不正确的?)。那个和'first'也是一个可接受的函数调用。所有这一切都让我感到困惑。