首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Leiningen命令args解析

Leiningen命令args解析
EN

Stack Overflow用户
提问于 2017-05-13 18:12:38
回答 2查看 310关注 0票数 1

我是Clojure的新手,我对leib命令行args有一个问题,我不能再去看了。我的应用程序很简单:

代码语言:javascript
运行
复制
 (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)
))

终端输出:

代码语言:javascript
运行
复制
lein run :f bit-xor :w 200 :h 200
{:w 200, :h 200, :f bit-xor}
nil nil nil

当我从REPL运行-main时,它运行得很好。当我在core.clj中定义一个hashmap时,像这样也很好。

代码语言:javascript
运行
复制
(def my-args (hasmap :f "bit-xor" :w 200 :h 200))

我搞不懂,为什么我的“f”,“w”和“h”在“让”中“零”。有人能帮忙吗?

我做了一个特别的小应用程序,只是为了测试。

代码语言:javascript
运行
复制
 (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输出:

代码语言:javascript
运行
复制
 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输出:

代码语言:javascript
运行
复制
 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
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-05-13 23:10:01

:keys析构只适用于关键字,您认为通过-main输入的关键字实际上不是关键字,而是字符串,每个字符串都以冒号开头。要确认这一点,请对输入的参数使用函数type

我从https://clojure.org/guides/destructuring上找到了这句话:

:key键用于关联值和关键字键。

如果确实需要将传入的参数转换为关键字,则使用keyword

代码语言:javascript
运行
复制
(keyword (subs ":f" 1))

所以在你的情况下,你可能会这样做:

代码语言:javascript
运行
复制
(map (comp keyword #(subs % 1)) [":f" ":w" ":h"])

,而不是[":f" ":w" ":h"],您将拥有args

当然,如果您决定省略冒号,那么事情就会变得简单一些,这在Clojure阅读器之外是没有意义的:https://clojure.org/reference/reader

票数 1
EN

Stack Overflow用户

发布于 2017-05-14 07:31:30

谢谢!REPL和Lein对“args”的不同解释有点让人费解。

REPL解释在

-main :param1 200

进入clojure.lang.Keyword

但在莱恩

lein run :param1 200

进入'java.lang.String'.

我尝试过:strs而不是:键,但忘了冒号。这是行之有效的:

代码语言:javascript
运行
复制
(defn -main
 [& args]
 (let [{:strs [:param1 :param2]} (apply hash-map args)]
 (println "param1: " param1)
 (println "param2: " param2)))

当然,在这个例子中,param的名字前面的冒号并不意味着什么。

用于:我已经完成了以下操作

代码语言:javascript
运行
复制
(defn -main
  [& args]

  (let [{:keys [param1 param2]} 
     (into {} (for [[k  v] (apply hash-map args)]
                   [(keyword (apply str (rest k))) v]))]
  (println "param1: " param1)
  (println "param2: " param2)))
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43956431

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档