【发布时间】:2017-10-12 21:03:26
【问题描述】:
我是 Clojure 的新手,我对 leib 命令行参数有疑问,我无法解决。我的应用很简单:
(defn -main
[& args]
(println (apply hash-map args))
(let [{:keys [f w h]} (apply hash-map args)]
(println f w h)
; (init-frame w h)
; (draw-values f w h)
))
终端输出:
lein run :f bit-xor :w 200 :h 200
{:w 200, :h 200, :f bit-xor}
nil nil nil
当我从 REPL 运行 -main 时,它运行良好。当我在 core.clj 中定义一个 hashmap 时,这样的效果也很好。
(def my-args (hasmap :f "bit-xor" :w 200 :h 200))
我不明白,为什么我的 'f'、'w' 和 'h' 在 let get nil 中。有人可以帮忙吗?
我做了一个特殊的小应用程序只是为了测试。
(ns cmdargs.core
(:gen-class))
(defn -main
[& args]
(println "args: " args)
(println "args map: " (apply hash-map args))
(println "param keys: " (keys (apply hash-map args)))
(println "param vals: " (vals (apply hash-map args)))
(let [{:keys [param1 param2]} (apply hash-map args)]
(println "param1: " param1)
(println "param2: " param2)))
REPL 输出:
cmdargs.core> (-main :param1 200 :param2 300)
args: (:param1 200 :param2 300)
args map: {:param2 300, :param1 200}
param keys: (:param2 :param1)
param vals: (300 200)
param1: 200
param2: 300
nil
cmdargs.core>
终端/lein 输出:
cmdargs$ lein run :param1 200 :param2 300
Java HotSpot(TM) Client VM warning: TieredCompilation is disabled in this release.
Java HotSpot(TM) Client VM warning: TieredCompilation is disabled in this release.
args: (:param1 200 :param2 300)
args map: {:param1 200, :param2 300}
param keys: (:param1 :param2)
param vals: (200 300)
param1: nil
param2: nil
【问题讨论】:
-
这是一个错字
(defn my-args ...)?它应该是def -
谢谢@Shlomi!我纠正了。但是 (def my-args ...) 只是为了检查 'let' 中的解构工作而定义的。