проблема закрытия - PullRequest
       0

проблема закрытия

4 голосов
/ 16 июля 2010

У меня есть простая проблема синтаксиса clojure (потому что я новичок в этом языке). для обоих примеров у меня есть список lst из (1 2 3 4):

в Лиспе я могу написать:

=> `(первый из списка, (первый lst))
(первый в списке 1)

в Clojure, если я напишу то же самое (с языковым переводом, к ~ как я ДУМАЛ, что где-то читал), я получу:

=> '(первый из списка ~ (первый lst))
(первый из списка (clojure.core / unquote (first lst)))

Я надеялся, что смогу делать то, что хочу, и в Clojure, и что у меня просто неверный синтаксис. хотя все примеры, которые я нахожу, сначала имеют функции и используют `(backtick). я не хочу вызывать такую ​​функцию, как:

`(my-function ~ (first lst))

я просто хочу вернуть '(некоторый список, в котором (первый lst) заменен)

Могу ли я сделать такую ​​вещь в Clojure?

РЕДАКТИРОВАТЬ: я дал плохой пример, видя, как моя фактическая проблема связана со строками. позвольте мне попробовать другой пример ...

=> (def color-lst '(красный, зеленый, синий))

что я хотел вернуть было:

=> `(цвет, который я хочу, ~ (первый цвет-lst))

это принесло мне все странные результаты, которые я видел. Другой способ сделать это -

=> (формат "цвет, который я хочу, это% s" (первый цвет-lst))

Вот так я решил свою проблему.

Ответы [ 3 ]

4 голосов
/ 16 июля 2010

Даже если ваша проблема решена, есть некоторые фундаментальные различия между CL и Clojure, о которых стоит упомянуть:

Основное отличие, касающееся символов в обратных кавычках между CL и Clojure, заключается в том, что Clojure разрешает символы в кавычках; получив квалифицированный символ пространства имен (взгляните на раздел для чтения документации Clojure):

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 (игнорируя регистр чтения), вы должны будете использовать:

user> (let [lst '(foo bar baz)]
        `(~'first ~'is ~(first lst)))
(first is foo)
2 голосов
/ 16 июля 2010

Мне немного неясно, что вы подразумеваете под "первым из списка" в вашем коде:

'(first of list is ,(first lst))

Но если вы подразумевали под этим просто заполнитель для начала списка, то следующее должно работать нормально (обязательно используйте backtick!):

`(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]))) 
0 голосов
/ 16 июля 2010

нашел другой способ. может быть, все время я просто не делал что-то «Clojure»?

(формат "первый из списка% d" (первый lst)) дает то, что я искал.

Я думаю, что это частично было моей ошибкой в ​​описании проблемы, я привел плохой пример. Кажется, проблема возникла, потому что я использовал строки (возможно, неправильно?) в списке. это и 'first' также является допустимым вызовом функции. все это запутало проблему, в которую я верю.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...