最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

CommonLisp中解析命令行參數(shù)示例

 更新時(shí)間:2022年08月22日 11:27:52   作者:LiuTao9292  
這篇文章主要為大家介紹了CommonLisp中解析命令行參數(shù)示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

clingon

clingon 是一個(gè) Common Lisp 的命令行選項(xiàng)的解析器,它可以輕松地解析具有復(fù)雜格式的命令行選項(xiàng)。例如,下面的代碼可以打印給定次數(shù)的打招呼信息

#!/bin/sh
#|-*- mode:lisp -*-|#
#|
exec ros -Q -- $0 "$@"
|#
(progn ;;init forms
  (ros:ensure-asdf)
  #+quicklisp(ql:quickload '(clingon) :silent t)
  )
(defpackage :ros.script.hello.3868869124
  (:use :cl
        :clingon))
(in-package :ros.script.hello.3868869124)
(defun top-level/handler (cmd)
  (check-type cmd clingon:command)
  (let ((count (clingon:getopt cmd :count))
        (name (first (clingon:command-arguments cmd))))
    (dotimes (_ count)
      (declare (ignorable _))
      (format t "Hello ~A!~%" name))))
(defun main (&rest argv)
  (let ((app (clingon:make-command
              :handler #'top-level/handler
              :name "hello"
              :options (list
                        (clingon:make-option
                         :integer
                         :description "number of greetings"
                         :initial-value 1
                         :key :count
                         :long-name "count")))))
    (clingon:run app argv)))
;;; vim: set ft=lisp lisp:

稍微做一些解釋。首先執(zhí)行命令ros init hello生成上面的代碼的雛形——加載依賴(lài)、包定義,以及空的函數(shù)main。為了加載 clingon,將其作為函數(shù)ql:quickload的參數(shù)。然后分別定義一個(gè)command、handler,以及option

在 clingon 中,類(lèi)clingon:command的實(shí)例對(duì)象表示一個(gè)可以在 shell 中被觸發(fā)的命令,它們由函數(shù)clingon:make-command創(chuàng)建。每一個(gè)命令起碼要有三個(gè)要素:

  • :handler,負(fù)責(zé)使用命令行選項(xiàng)、實(shí)現(xiàn)業(yè)務(wù)邏輯的函數(shù);
  • :name,命令的名字,一般會(huì)被展示在命令的用法說(shuō)明中;
  • :options,該命令所接受的選項(xiàng)。

此處的:handler就是函數(shù)top-level/handler,它會(huì)被函數(shù)clingon:run調(diào)用(依賴(lài)注入的味道),并將一個(gè)合適的clingon:command對(duì)象傳入。:options目前只承載了一個(gè)選項(xiàng)的定義,即

                        (clingon:make-option
                         :integer
                         :description "number of greetings"
                         :initial-value 1
                         :key :count
                         :long-name "count")

它定義了一個(gè)值為整數(shù)的選項(xiàng),在命令行中通過(guò)--count指定。如果沒(méi)有傳入該選項(xiàng),那么在使用函數(shù)clingon:getopt取值時(shí),會(huì)獲得默認(rèn)值 1。如果要從一個(gè)命令對(duì)象中取出這個(gè)選項(xiàng)的值,需要以它的:key參數(shù)的值作為參數(shù)來(lái)調(diào)用函數(shù)clingon:getopt,正如上面的函數(shù)top-level/handler所示。

子命令

clingon 也可以實(shí)現(xiàn)諸如git addgit branch這樣的子命令特性。像add、branch這樣的子命令,對(duì)于 clingon 而言仍然是類(lèi)clingon:command的實(shí)例對(duì)象,只不過(guò)它們不會(huì)傳遞給函數(shù)clingon:run調(diào)度,而是傳遞給函數(shù)clingon:make-command的參數(shù):sub-command,如下列代碼所示

(defun top-level/handler (cmd)
  (declare (ignorable cmd)))
(defun main (&rest argv)
  (let ((app (clingon:make-command
              :handler #'top-level/handler
              :name "cli"
              :sub-commands (list
                             (clingon:make-command
                              :handler #'(lambda (cmd)
                                           (declare (ignorable cmd))
                                           (format t "Dropped the database~%"))
                              :name "dropdb")
                             (clingon:make-command
                              :handler #'(lambda (cmd)
                                           (declare (ignorable cmd))
                                           (format t "Initialized the database~%"))
                              :name "initdb")))))
    (clingon:run app argv)))

選項(xiàng)與參數(shù)

在 clingon 中通過(guò)命令行傳遞給進(jìn)程的信息分為選項(xiàng)和參數(shù)兩種形態(tài),選項(xiàng)是通過(guò)名字來(lái)引用,而參數(shù)則通過(guò)它們的下標(biāo)來(lái)引用。

例如在第一個(gè)例子中,就定義了一個(gè)名為--count的選項(xiàng),它在解析結(jié)果中被賦予了:count這個(gè)關(guān)鍵字,可以通過(guò)函數(shù)clingon:getopt來(lái)引用它的值;

與之相反,變量name是從命令行中解析了選項(xiàng)后、剩余的參數(shù)中的第一個(gè),它是以位置來(lái)標(biāo)識(shí)的。clingon 通過(guò)函數(shù)clingon:make-option來(lái)定義選項(xiàng),它提供了豐富的控制能力。

選項(xiàng)名稱(chēng)

選項(xiàng)有好幾種名字,一種叫做:key,是在程序內(nèi)部使用的名字,用作函數(shù)clingon:getopt的參數(shù)之一;

一種叫做:long-name,一般為多于一個(gè)字符的字符串,如"count",在命令行該名稱(chēng)需要帶上兩個(gè)連字符的前綴來(lái)使用,如--count 3

最后一種叫做:short-name,為一個(gè)單獨(dú)的字符,如#\v,在命令行中帶上一個(gè)連字符前綴來(lái)使用,如-v

必要性與默認(rèn)值

通過(guò)傳入?yún)?shù):required t給函數(shù)clingon:make-option,可以要求一個(gè)選項(xiàng)為必傳的。

例如下面的命令的選項(xiàng)--n就是必傳的

(defun top-level/handler (cmd)
  (dotimes (i (clingon:getopt cmd :n))
    (declare (ignorable i))
    (format t ".")))
(defun main (&rest argv)
  (let ((app (clingon:make-command
              :handler #'top-level/handler
              :name "dots"
              :options (list
                        (clingon:make-option
                         :integer
                         :description "打印的英文句號(hào)的數(shù)量"
                         :key :n
                         :long-name "n"
                         :required t)))))
    (clingon:run app argv)))

如果不希望在一些最簡(jiǎn)單的情況下也要繁瑣地編寫(xiě)--n 1這樣的命令行參數(shù),可以用:initial-value 1來(lái)指定。除此之外,也可以讓選項(xiàng)默認(rèn)讀取指定的環(huán)境變量中的值,使用:env-vars指定環(huán)境變量名即可

(defun top-level/handler (cmd)
  (format t "Hello ~A~%" (clingon:getopt cmd :username)))
(defun main (&rest argv)
  (let ((app (clingon:make-command
              :handler #'top-level/handler
              :name "greet"
              :options (list
                        (clingon:make-option
                         :string
                         :description "用戶名"
                         :env-vars '("GREETER_USERNAME")
                         :key :username
                         :long-name "username")))))
    (clingon:run app argv)))

可多次使用的選項(xiàng)

curl中的選項(xiàng)-H就是可以多次使用的,每指定一次就可以在請(qǐng)求中添加一個(gè) HTTP 頭部,如下圖所示

在 clingon 中可以通過(guò)往函數(shù)clingon:make-option傳入:list來(lái)實(shí)現(xiàn)。當(dāng)用clingon:getopt取出類(lèi)型為:list的選項(xiàng)的值時(shí),得到的是一個(gè)列表,其中依次存放著輸入的值的字符串。

(defun top-level/handler (cmd)
  (let ((messages (clingon:getopt cmd :message)))
    (format t "~{~A~^~%~}" messages)))
(defun main (&rest argv)
  (let ((app (clingon:make-command
              :handler #'top-level/handler
              :name "commit"
              :options (list
                        (clingon:make-option
                         :list
                         :description "提交的消息"
                         :key :message
                         :long-name "message"
                         :short-name #\m)))))
    (clingon:run app argv)))

另一種情況是盡管沒(méi)有值,但仍然多次使用同一個(gè)選項(xiàng)。例如命令ssh的選項(xiàng)-v,使用的次數(shù)越多(最多為 3 次),則ssh打印的調(diào)試信息也就越詳細(xì)。這種類(lèi)型的選項(xiàng)在 clingon 中稱(chēng)為:counter。

(defun top-level/handler (cmd)
  (format t "Verbosity: ~D~%" (clingon:getopt cmd :verbose)))
(defun main (&rest argv)
  (let ((app (clingon:make-command
              :handler #'top-level/handler
              :name "log"
              :options (list
                        (clingon:make-option
                         :counter
                         :description "啰嗦程度"
                         :key :verbose
                         :long-name "verbose"
                         :short-name #\v)))))
    (clingon:run app argv)))

信號(hào)選項(xiàng)

有一些選項(xiàng)只需要區(qū)分【有】和【沒(méi)有】?jī)煞N情況就可以了,而不需要在意這個(gè)選項(xiàng)的值——或者這類(lèi)選項(xiàng)本身就不允許有值,例如docker run命令的選項(xiàng)-d--detach

這種選項(xiàng)的類(lèi)型為:boolean/true,如果指定了這個(gè)選項(xiàng),那么取出來(lái)的值始終為t。與之相反,類(lèi)型:boolean/false取出來(lái)的值始終為nil。

(defun top-level/handler (cmd)
  (let ((rv (software-type)))
    (when (clingon:getopt cmd :shout)
      (setf rv (concatenate 'string (string-upcase rv) "!!!!111")))
    (format t "~A~%" rv)))
(defun main (&rest argv)
  (let ((app (clingon:make-command
              :handler #'top-level/handler
              :name "info"
              :options (list
                        (clingon:make-option
                         :boolean/true
                         :description "大喊"
                         :key :shout
                         :long-name "shout")))))
    (clingon:run app argv)))

選擇型選項(xiàng)

如果一個(gè)選項(xiàng)盡管接受的是字符串,但并非所有輸入都是有意義的,例如命令dot的選項(xiàng)-T。從dot的 man 文檔可以看到,它所支持的圖片類(lèi)型是有限的,如ps、pdfpng等。

比起聲明一個(gè):string類(lèi)型的選項(xiàng),讓 clingon 代勞輸入值的有效性檢查來(lái)得更輕松,這里可以使用:choice類(lèi)型

(defun top-level/handler (cmd)
  (format t "~A~%" (clingon:getopt cmd :hash-type)))
(defun main (&rest argv)
  (let ((app (clingon:make-command
              :handler #'top-level/handler
              :name "digest"
              :options (list
                        (clingon:make-option
                         :choice
                         :description "哈希類(lèi)型"
                         :items '("MD5" "SHA1")
                         :key :hash-type
                         :long-name "hash-type")))))
    (clingon:run app argv)))

以上就是CommonLisp中解析命令行參數(shù)示例的詳細(xì)內(nèi)容,更多關(guān)于CommonLisp命令行參數(shù)的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 在CODEIGNITER中 在CI中引入外部的JS與CSS呢

    在CODEIGNITER中 在CI中引入外部的JS與CSS呢

    其實(shí)不管是在用CI還是ZF都有同樣一個(gè)問(wèn)題,就是路徑的問(wèn)題。前期,我在用ZF做CMS時(shí),我在.htaccess文件中設(shè)置了如遇到j(luò)s,css,img等資源文件都不重定向。
    2009-07-07
  • Fiddler4的安裝與使用詳解

    Fiddler4的安裝與使用詳解

    這篇文章主要介紹了Fiddler4的安裝與使用詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-01-01
  • 淺談OAuth 2.0 的一個(gè)簡(jiǎn)單解釋

    淺談OAuth 2.0 的一個(gè)簡(jiǎn)單解釋

    這篇文章主要介紹了淺談OAuth 2.0 的一個(gè)簡(jiǎn)單解釋?zhuān)【幱X(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2020-10-10
  • 都2019年了,還問(wèn)http中GET和POST的區(qū)別

    都2019年了,還問(wèn)http中GET和POST的區(qū)別

    最近看了一些同學(xué)的面經(jīng),發(fā)現(xiàn)無(wú)論什么技術(shù)崗位,還是會(huì)問(wèn)到 get 和 post 的區(qū)別,而搜索出來(lái)的答案并不能讓我們裝得一手好逼,那就讓我們從 HTTP 報(bào)文的角度來(lái)擼一波,從而搞明白他們的區(qū)別
    2019-02-02
  • DVWA下載、安裝、使用(漏洞測(cè)試環(huán)境搭建)的詳細(xì)教程

    DVWA下載、安裝、使用(漏洞測(cè)試環(huán)境搭建)的詳細(xì)教程

    這篇文章主要介紹了DVWA下載、安裝、使用(漏洞測(cè)試環(huán)境搭建)的詳細(xì)教程,本文通過(guò)圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-10-10
  • Security安裝 Elastic SIEM 和 EDR的超詳細(xì)教程

    Security安裝 Elastic SIEM 和 EDR的超詳細(xì)教程

    這篇文章主要介紹了Security安裝 Elastic SIEM 和 EDR的超詳細(xì)教程,本文通過(guò)圖文實(shí)例相結(jié)合給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-03-03
  • 漢明碼編碼原理及校驗(yàn)方法分析

    漢明碼編碼原理及校驗(yàn)方法分析

    漢明碼在傳輸?shù)南⒘髦胁迦腧?yàn)證碼,當(dāng)計(jì)算機(jī)存儲(chǔ)或移動(dòng)數(shù)據(jù)時(shí),可能會(huì)產(chǎn)生數(shù)據(jù)位錯(cuò)誤,以偵測(cè)并更正單一比特錯(cuò)誤。由于漢明編碼簡(jiǎn)單,它們被廣泛應(yīng)用于內(nèi)存RAM
    2021-09-09
  • VSCode + WSL 2 + Ruby環(huán)境搭建圖文詳解

    VSCode + WSL 2 + Ruby環(huán)境搭建圖文詳解

    這篇文章主要介紹了VSCode + WSL 2 + Ruby環(huán)境搭建,本文通過(guò)圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-06-06
  • 網(wǎng)站搜索框使用微信掃碼功能

    網(wǎng)站搜索框使用微信掃碼功能

    客戶要求可以直接識(shí)別標(biāo)簽二維碼對(duì)某些儀器設(shè)備進(jìn)行管理,類(lèi)似于淘寶搜索框可以直接拍照搜索商品一樣。接下來(lái)通過(guò)本文給大家分享網(wǎng)站搜索框使用微信掃碼功能,需要的朋友可以參考下
    2019-08-08
  • 解釋執(zhí)行和編譯執(zhí)行的區(qū)別?

    解釋執(zhí)行和編譯執(zhí)行的區(qū)別?

    在說(shuō)解釋執(zhí)行和編譯執(zhí)行之前先說(shuō)幾個(gè)概念,需要的朋友可以參考下。
    2011-09-09

最新評(píng)論

宣恩县| 永济市| 太保市| 烟台市| 宁波市| 湄潭县| 高青县| 昆山市| 诸城市| 峨边| 平南县| 特克斯县| 饶阳县| 卢湾区| 德令哈市| 界首市| 安仁县| 海口市| 留坝县| 乃东县| 泰来县| 乐山市| 鄂尔多斯市| 防城港市| 逊克县| 富民县| 昭平县| 游戏| 阿合奇县| 玉溪市| 靖江市| 广汉市| 邵阳县| 漳平市| 开封市| 尼勒克县| 克拉玛依市| 甘肃省| 丹阳市| 承德市| 吴川市|