как можно использовать # в let - PullRequest
0 голосов
/ 04 августа 2020

Вот пример кода

(def showscp
     ( let [ cf     (seesaw.core/frame :title "cframe")]
       (do
         (seesaw.core/config! cf :content (seesaw.core/button :id :me :text "btn" ))
         (.setSize cf 300 300)
         (seesaw.core/show! cf)
         cf
       )
     )
)

Для кнопки получения я использую это

(defn find-me 
   ([frame]
         (let [ btn (seesaw.core/select frame [:#me] )  ] (do btn)
         )
   )
)

Это вызывает ошибку, например

Источник чтения синтаксической ошибки в (REPL : 2: 1). EOF при чтении, начиная со строки 2

(я думаю: #me - проблема в макросе.)

почему причина ошибки и как ее избежать.

Is есть способ умнее, чем (keyword "#me")

Ответы [ 3 ]

1 голос
/ 05 августа 2020

# используется только в начале токена, чтобы управлять тем, как этот токен анализируется. Это вполне допустимо как часть имени переменной или ключевого слова. Ваш код ломается, если я вставляю его в ответ, но работает, если я набираю его вручную. Это убедительно свидетельствует о том, что вы случайно включили в свою функцию какой-то непечатаемый символ или другой странный вариантный символ.

0 голосов
/ 04 августа 2020

Знак фунта (он же octothorpe) - это специальный управляющий символ читателя в Clojure, поэтому вы не можете использовать его в буквальном ключевом слове, имени переменной и т. Д. c.

Ваше предложение (keyword "#me") будет работать, хотя, вероятно, было бы лучше изменить ваш код, чтобы просто использовать строку "#me" или вообще исключить необходимость в символе фунта.

0 голосов
/ 04 августа 2020

Вы не можете использовать #, потому что это символ отправки .

# - специальный символ, который сообщает читателю Clojure (компонент, который принимает исходный код Clojure и "читает" его как данные Clojure) как интерпретировать следующий символ

...