0

这是示例代码

(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 是宏中的问题。)

为什么会导致错误,以及如何避免错误。

还有比这更聪明的方法吗(keyword "#me")

4

3 回答 3

1

#仅在标记的开头是特殊的,用于控制该标记的解析方式。它作为变量名或关键字的一部分是完全有效的。如果我将其粘贴到 repl 中,您的代码会中断,但如果我手动重新输入,则可以使用。这向我强烈暗示你不小心在你的函数中包含了一些非打印字符或其他奇怪的变体字符。

于 2020-08-04T22:45:34.670 回答
0

你不能使用#,因为它是一个调度字符

# 是一个特殊字符,它告诉 Clojure 阅读器(获取 Clojure 源并将其“读取”为 Clojure 数据的组件)如何解释下一个字符

于 2020-08-04T18:51:42.733 回答
0

磅字符(又名 octothorpe)是 Clojure 中一个特殊的阅读器控制字符,因此您不能在文字关键字、变量名等中使用它。

您的建议(keyword "#me")将起作用,尽管将代码修改为仅使用 string"#me"或完全消除对 pound-char 的需要可能会更好。

于 2020-08-04T18:52:55.437 回答