在 Clojure 中使用 "proxy" 的 IllegalArgumentException

IllegalArgumentException using "proxy" in Clojure

我按照本教程学习了 clojure(https://www.youtube.com/watch?v=zFPiPBIkAcQ 大约 2:26)。在最后一个示例中,您编写了游戏“贪吃蛇”。

(ns ...tests.snake
 (:import
   (java.awt Color Dimension)
   (javax.swing JPanel JFrame Timer JOptionPane)
   (java.awt.event ActionListener KeyListener KeyEvent)))

...

113 (defn game-panel [frame snake apple]
114   (proxy [JPanel ActionListener KeyListener] []
115     ;JPanel
116     (paintComponent [g]
117       (proxy-super paintComponent g)
118       (paint g @apple)
119       (paint g @snake))
120     (getPreferredSize []
121       (Dimension. (* (inc field-width) point-size)
122                   (* (inc field-height) point-size)))
123     ;ActionListener
124    (actionPerformed [e]
125       (update-positions snake apple)
126       (if (lose? @snake)
127         (do
128           (reset-game snake apple)
129           (JOptionPane/showMessageDialog frame "You lose")))
130       (if (win? @snake)
131         (do
132           (reset-game snake apple)
133           (JOptionPane/showMessageDialog "You win")))
134       (.repaint this))
135     (keyPressed [e]
136                 (let [direction (directions (.getKeyCode e))]
137                   (if direction 
138                     (update-direction snake direction))))
139     (keyReleased [e])
140     (keyTyped [e])))

我在使用“代理”时收到 IllegalArgumentException。

; Syntax error (IllegalArgumentException) compiling new at (c:\[...]\Clojure_Project\tests\snake.clj:114:3).
; Unable to resolve classname: ...tests.snake.proxy$javax.swing.JPanel$ActionListener$KeyListenerb88ffec

起初我以为这可能与我传递多个参数有关,但那似乎不是问题。

我使用 VisualStudioCode 和 Calva 的“Getting Starting REPL”(因为我不知道如何连接另一个)。

我不知道,我是不是忘记安装或导入什么东西了? 我试着看一下“代理”的代码,但由于我对编程语言还不是很熟悉,所以对我帮助不大。

我的代码:https://github.com/shadowprincess/clojure-learning

最初查看您的问题时,我认为您的 ...tests.snake 命名空间只是您省略的内容,而不是实际的命名空间名称。 但是鉴于您的回购协议,它似乎是您正在使用的真实命名空间名称。

这是无效的 - 您不能使用 . 启动命名空间。将其重命名为 tests.snake,错误将消失。

不幸的是,您在 repo 中的代码仍然无法运行,因为还有许多其他错误,但您应该很容易自己找出这些错误。作为一般性建议 - 不要 运行 通过将单独的表格发送到 REPL 来处理整个项目。了解如何使用单个命令启动它 - 它会产生良好的实践,即使在使用 REPL 时也很有用。