对于练习,我已经定义了
(defmacro quote-paren
"body -> `(body)"
[& body]
`(~@body))
Run Code Online (Sandbox Code Playgroud)
它具有预期的转换(quote-paren body)=>``(body)`.它似乎满足一些基本测试:
user=> (macroexpand-1 `(quote-paren 3 4 5))
(3 4 5)
user=> (macroexpand-1 `(quote-paren println "hi"))
(clojure.core/println "hi")
user=> (macroexpand-1 `(quote-paren (println "hi")))
((clojure.core/println "hi"))
Run Code Online (Sandbox Code Playgroud)
但是,我一直用这个do-while宏测试它(从这里修改):
(defmacro do-while
[test & body]
(quote-paren loop []
~@body
(when ~test
(recur))))
(def y 4)
(do-while (> y 0)
(def y (dec y)))
Run Code Online (Sandbox Code Playgroud)
但结果是
IllegalStateException Attempting to call unbound fn: #'clojure.core/unquote-splicing clojure.lang.Var$Unbound.throwArity (Var.java:43)
Run Code Online (Sandbox Code Playgroud)
我不明白这一点,因为我可以看到`quote-paren'宏工作正常(~~ body插入):
user=> (macroexpand-1
`(quote-paren loop []
(def …Run Code Online (Sandbox Code Playgroud) 任何lisps支持嵌套的s表达式吗?例如
((f 2) 3 4)
Run Code Online (Sandbox Code Playgroud)
对于这(f 2)大概计算一个函数/宏应用上3 4.
是否可以让lisp支持这样的事情?或者是否有技术限制禁止这种做法/使其不切实际?
我有许多相同长签名的功能(为简单起见,这里简称):
(defn f
[x & {:keys [a b c d e f g h]
:or [a false b false c false d false e false f false g false h false]}]
a)
Run Code Online (Sandbox Code Playgroud)
我希望事先使用宏,函数甚至def来存储这个共同的签名:
(def args `[a b c d e f g h])
(defn args [] `[a b c d e f g h])
(defmacro args [] `[a b c d e f g h])
Run Code Online (Sandbox Code Playgroud)
但是当我插入时,所有这些都是
(defn f
[x & {:keys (args)
:or [a false b false c false d …Run Code Online (Sandbox Code Playgroud) 默认情况下,它:s/[search-term]/[replace-term]适用于整行而不是视觉选择.例如,如果您在c和e之间进行选择,则:
a b |c d e| f g
Run Code Online (Sandbox Code Playgroud)
而且:s/ //g,结果是:
abcdefg
Run Code Online (Sandbox Code Playgroud)
而不是
a b cde f g
Run Code Online (Sandbox Code Playgroud)
同样,在视觉块选择中:
a b |c d e| f g
0 1 |2 3 4| 5 6
Run Code Online (Sandbox Code Playgroud)
:s/ //g 产量
abcdefg
0123456
Run Code Online (Sandbox Code Playgroud)
而不是
a b cde f g
0 1 234 5 6
Run Code Online (Sandbox Code Playgroud)
有没有人有办法让邪恶模式的:s/工作只在选择上(最好是默认情况下,或者像vim这样的关键字\%V)?
(:s/\%V //g在这种情况下似乎不起作用;它会导致0场比赛.)
先谢谢.
有没有任何(合理的)方法可以将此宏编写为函数?
(defmacro assocTop
[v & args]
`(push (pop ~v)
(assoc (peek ~v) ~@args)))
Run Code Online (Sandbox Code Playgroud)
给定地图向量和一些关联,宏代码将关联应用于顶部/查看的地图。
但是,当尝试将其编写为函数时,我无法弄清楚如何~@args以合法的方式扩展。在普通函数中,有没有办法将args,我相信其形式(:a 3 :bb 44 :cd 90,...)变成:a 3 :bb 44 :cd 90,...,即没有括号?
有没有一种方法,使同时按键成键绑定,例如用于键w,e,f,当0.05秒彼此的内按下,触发命令?
更具体:
如果w,e,f被0.05秒彼此的内压,则在按下的最后一个,XMonad应该触发所述命令.XMonad也应截获三个键,以便它们不会被多余地发送到聚焦窗口.
否则(如果在0.05秒的时间内没有按下其中一个)XMonad应像往常一样将密钥发送到聚焦窗口.
我在这个目标是用w,e,f"逃"到一个VIM般的"正常模式",一个XMonad.Actions.Submap(子图).
使用失败的方法更新,以防任何人都可以看到修复它的方法:
我尝试使用子图实现这一点,所以,例如,如果你按下了,w你最终会进入chord_mode_w,如果你e从那里按下,你最终会进入chord_mode_we,如果你f从那里按下,你最终会最终进入normal_mode,例如.实现非常混乱:我在主要的键绑定中包括:
("w", spawn "xdotool key <chord_mode_w_keybinding> ; sleep 0.05 ; xdotool key <abort_keybinding>")
(chord_mode_w_keybinding, chord_mode_w)
Run Code Online (Sandbox Code Playgroud)
用于检测w(其余部分类似),以及(不完整的)子图,例如:
chord_mode_w = submap . mkKeymap c $
[
("e", chord_mode_we )
, ("f", chord_mode_wf )
, (abort_keybinding, pasteString "w")
-- in order for the …Run Code Online (Sandbox Code Playgroud) 我想有一个异构的名单String和[String],因此:
strs = ["h", ["x", "y"], "i", ["m", "n", "p"]]
Run Code Online (Sandbox Code Playgroud)
我知道我可以使用自定义数据类型执行此操作:
data EitherOr t = StringS t | StringL [t]
eitherOrstrs :: [EitherOr String]
eitherOrstrs = [StringS "h", StringL ["x", "y"], StringS "i", StringL ["m", "n", "p"]]
Run Code Online (Sandbox Code Playgroud)
但我很好奇这是否可能没有任何样板,strs如上所述.
到目前为止,我已经尝试过:
{-# LANGUAGE ExistentialQuantification #-}
class Listable a where
toListForm :: [String]
instance Listable String where
toListForm s = [s]
instance Listable [String] where
toListForm = id
strs :: forall a. Listable a => [a]
strs …Run Code Online (Sandbox Code Playgroud)