开发者

clojure unqoute problem

开发者 https://www.devze.com 2023-01-07 09:59 出处:网络
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):

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.

0

精彩评论

暂无评论...
验证码 换一张
取 消