clojure unqoute problem
i have a simple clojure syntax problem (bc i am new to the language). for both examples i have a list lst of (1 2 3 4):
in Lisp i can write:
=>`(first of list is ,(first lst))
(first of list is 1)
in Clojure, if i write the same thing (with the language translation of , to ~ as i THOUGHT i read somewhere) i get:
=>'(first of list is ~(first lst))
(first of list is (clojure.core/unquote (first lst)))
i was hoping i can do what i want to in Clojure as well, and that i just have the syntax wrong. all the examples i find though have functions first and use a ` (backtick). i dont want to call a function like:
`(my-function ~(first lst))
i just want to return '(some list with ,(first lst) replaced in it)
can i do such a thing in Clojure?
EDIT: i gave a poor example seeing as my ACTUAL problem dealt with strings. let me try another example...
=>(def color-lst '(red green blue))
what i wanted to return was:
=>`(the color i want is ~(first color-lst))
this yeilded all the strange returns i saw. the other way to do this is
=>(format "the color i want is %s" (first color-lst))开发者_运维技巧
this is how i solved my problem.
Even if your problem is solved, there are some fundamental differences between CL and Clojure worth mentioning:
The main difference concerning symbols in backquotes between CL and Clojure is, that Clojure resolves quasiquoted symbols; yielding a namespace qualified symbol (take a look at the reader section of the Clojure docs):
user> `foo
user/foo
So, in CL:
CL-USER> (let ((list '(foo bar baz)))
`(first is ,(first list)))
(FIRST IS FOO)
But in Clojure:
user> (let [lst '(foo bar baz)]
`(first is ~(first lst)))
(clojure.core/first user/is foo)
In order to get a non-qualified symbol in Clojure (within backquotes), you'd have to use something like this:
user> `~'foo
foo
So, to get the same result as the CL version (ignoring readtable-case), you'd have to use:
user> (let [lst '(foo bar baz)]
`(~'first ~'is ~(first lst)))
(first is foo)
It's slightly unclear to me what you mean by "first of list is" in your code:
'(first of list is ,(first lst))
But if you meant by that just a placeholder for the beginning of the list, then the following should work fine (make sure to use backtick!):
`(1 2 3 ~(first [1 2]))
=> (1 2 3 1)
Alternatively, using quote will result in the following (which seems to be your problem):
'(1 2 3 ~(first [1 2]))
=> (1 2 3 (clojure.core/unquote (first [1 2])))
found another way. perhaps the whole time i was just not doing things the 'Clojure' way?
(formate "first of list is %d" (first lst)) yeilds what i was looking for.
i think it was partly my fault in the problem description, i gave a bad example. it seems the problem arose bc i was using strings (possibly improperly?) in the list. that and 'first' is also an acceptable function call. all of that confused the issue i believe.
精彩评论