小编spa*_*sue的帖子

麻烦的clojure引用-paren`(...)宏

对于练习,我已经定义了

(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)

macros clojure parentheses quote

7
推荐指数
1
解决办法
1006
查看次数

任何lisps都有一个s表达式,例如((f 2)3 4)?如果没有,为什么?

任何lisps支持嵌套的s表达式吗?例如

((f 2) 3 4)
Run Code Online (Sandbox Code Playgroud)

对于这(f 2)大概计算一个函数/宏应用上3 4.

是否可以让lisp支持这样的事情?或者是否有技术限制禁止这种做法/使其不切实际?

lisp nested head s-expression lisp-2

7
推荐指数
2
解决办法
322
查看次数

Clojure:使用宏或def的函数参数/签名

我有许多相同长签名的功能(为简单起见,这里简称):

(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)

reduce arguments function clojure definition

4
推荐指数
1
解决办法
250
查看次数

Emacs,Evil-Mode:仅在视觉选择/视觉块中替换?

默认情况下,它: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场比赛.)

先谢谢.

emacs replace selection evil-mode

4
推荐指数
1
解决办法
1191
查看次数

Clojure:如何将剩余参数“&args”发送到列表中?

有没有任何(合理的)方法可以将此宏编写为函数?

(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,...,即没有括号?

macros expand function clojure args

2
推荐指数
1
解决办法
577
查看次数

XMonad:有没有办法绑定同时触发的键盘?

有没有一种方法,使同时按键成键绑定,例如用于键w,e,f,当0.05秒彼此的内按下,触发命令?

更具体:

  1. 如果w,e,f被0.05秒彼此的内压,则在按下的最后一个,XMonad应该触发所述命令.XMonad也应截获三个键,以便它们不会被多余地发送到聚焦窗口.

  2. 否则(如果在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)

xmonad key-bindings

2
推荐指数
1
解决办法
672
查看次数

Haskell:为String和/或[String]的异构列表键入(没有样板)?

我想有一个异构的名单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)

haskell types list existential-type heterogeneous

2
推荐指数
1
解决办法
101
查看次数