(defn editing-mode? []
"a hardcoded (for the moment) value, will look up in db later"
false)
(def UP 38) ;; goog.events.KeyCodes.UP
(def DOWN 40) ;; goog.events.KeyCodes.DOWN
(def LEFT 37) ;; goog.events.KeyCodes.LEFT
(def RIGHT 39) ;; goog.events.KeyCodes.RIGHT
(def W 87) ;; goog.events.KeyCodes.W
(def S 83) ;; goog.events.KeyCodes.S
(def A 65) ;; goog.events.KeyCodes.A
(def D 68) ;; goog.events.KeyCodes.D
(def E 69) ;; goog.events.KeyCodes.E
(def ESC 27) ;; goog.events.KeyCodes.ESC
(defn delta [e]
;; e is a google closure Event
(js/console.log (.-keyCode e))
(js/console.log (editing-mode?))
(match [(editing-mode?) (.-keyCode e)]
[false 38] [:slide :up]
[false 40] [:slide :down]
[false 37] [:slide :left]
[false 39] [:slide :right]
[false 87] [:slide :up]
[false 83] [:slide :down]
[false 65] [:slide :left]
[false 68] [:slide :right]
[false 69] [:start-editing]
[true 27] [:done-editing]
:else nil))以上代码起作用。然而,如果我尝试少一点文字,直接使用goog键码,就像这样
(match [(editing-mode?) (.-keyCode e)]
[false goog.events.KeyCodes.UP] [:slide :up]
[false goog.events.keyCodes.DOWN] [:slide :down]
...我得到以下cljsbuild错误:
...
Caused by: clojure.lang.ExceptionInfo: Invalid local name: goog.events.KeyCodes.UP ...
...好的,所以我不能使用goog.events.KeyCodes.*本身,但是也许我可以使用引用到它们的def?所以我试着
(match [(editing-mode?) (.-keyCode e)]
[false UP] [:slide :up]
[false DOWN] [:slide :down]
...这确实是编译的,但是现在match不起作用了。每个键事件都匹配[false UP]匹配子句(core.match总是发射[:slide :up])。
无论如何,第一个代码示例确实有效。但是为什么我不能在我的goog.events.KeyCodes.*匹配器中使用goog.events.KeyCodes.*或引用goog.events.KeyCodes.*呢?我遗漏了什么吗?
发布于 2014-07-27 09:02:53
core.match的一个关键部分是符号将绑定到值,而不是与之匹配。也就是说,UP的当前值不被查找并在匹配中使用;相反,当false匹配时,符号UP被绑定到值(.-keyCode e)。
不幸的是,据我所知,core.match对此无能为力。这在很大程度上取决于文字值。但是,由于您的模式相当简单,所以可以使用(conp = ...)。
发布于 2015-04-26 13:50:48
您只能匹配针对本地绑定
(= (let [x 2
y 2]
(match [x]
[0] :a0
[1] :a1
[y] :a2
:else :a3))
:a2))因此,您可以通过通过(let [...])将密钥代码绑定到局部变量来实现您的结果。
发布于 2015-06-18 06:42:39
我喜欢通过简单的倒置KeyCodes对象来构造"keyname“到"keycode”的映射:
(ns awesome.sauce
(:require [clojure.set :as set])
(:import [goog.events KeyCodes]))
(def codename
(set/map-invert (js->clj KeyCodes)))然后,我可以用字符串而不是笨拙的互操作来识别键(字符串是值,所以可以很好地匹配):
(match [(editing-mode?) (codename (.-keyCode e))]
[false "UP"] [:slide :up]
[false "DOWN"] [:slide :down])https://stackoverflow.com/questions/24975999
复制相似问题