Common Lisp Tips

メモを残していきます. 不定期に更新します.

1 インストール

TBD

2 略称を定義する

(defmacro abbrev (short long)
  `(defmacro ,short (&rest args)
     `(,',long ,@args)))

(abbrev dbind destructuring-bind) ; too hard to remember

(dbind (x y) '(a b)
  (format t "~s, ~s~%" x y))
A, B

cf. http://www.bookshelf.jp/texi/onlisp/onlisp_17.html

3 パッケージ定義

asdファイルに使うファイルを記述する(面倒) defpackage ではパッケージ名はキーワードにする

4 Common Lispにsplitはないの?

文字列を指定の文字で分割するには, split-sequence:split-sequence を使う.

(quicklisp:quickload :split-sequence)
(split-sequence:split-sequence #\Space "this is sample CL program")

リストも分割できる.

(split-sequence:split-sequence 'a '(p a n a m a n o b a n a n a))
(P) (N) (M) (N O B) (N) (N) NIL

5 標準入力から行を読み込む

read-line で1行読み込むことができる.全ての行を読み込むには loop マクロなどを使う.

(loop for line = (read-line nil nil :eof)
      until (eq line :eof)
      do (print t "%s%~" line))

6 Octet streamを文字列に変換したい

flexi-streams:octets-to-string を使う.

7 http clientを使いたい

drakma:http-request を使う.

8 jsonを書きたい

jsown:to-json を使う.オブジェクトを生成するには (:obj key val) を使う. jsonをパースするには jsown:parse を使う.

(quicklisp:quickload :jsown)
(jsown:to-json '(:obj (hello . "world")))
{"HELLO":"world"}
(jsown:parse "[1, 2, 3]")

9 分割代入

記述力に勝る optima.extra:let-match か, destructuring-bind を使う.

9.1 destructuring-bind

スペルを覚えにくい. de-structur-ing である.

(destructuring-bind
  (first second) #| <= bound |# '(alpha omega)
  (format t "head is ~s, another is ~s~%" first second))

9.2 match / let-match

let-matchmatchlet 風の記法である.

(quicklisp:quickload :optima)

;; define object to match
(setq lis '(alpha beta gamma))
(format t "lis is ~s~%" lis)

;; pattern-matching
(optima:match lis
  ((list first second third)
   (format t "first is ~s, second is ~s, third is ~s.~%" first second third)))

;; code above is equivalent to below
(optima.extra:let-match (((list first second third) lis))
  (format t "first is ~s, second is ~s, third is ~s.~%" first second third))
To load "optima":
  Load 1 ASDF system:
    optima
; Loading "optima"

lis is (ALPHA BETA GAMMA)
first is ALPHA, second is BETA, third is GAMMA.
first is ALPHA, second is BETA, third is GAMMA.

10 繰り返し

loop マクロを使う.

(setq xs '(alpha beta gamma))
(loop for x in xs
      do (format t "value is ~s~%" x))
value is ALPHA
value is BETA
value is GAMMA

cf. http://smpl.seesaa.net/article/29800843.html

11 #pとは

パスオブジェクトのリテラル.

12 #sとは

構造体のリテラル.

13 doubleとして数値を読む

*read-default-float-format* [http://www.lispworks.com/documentation/HyperSpec/Body/v_rd_def.htm] を使う.

(format t "~s~%" *read-default-float-format*)
(setq *read-default-float-format* 'double-float)
(format t "~s~%" *read-default-float-format*)
SINGLE-FLOAT
DOUBLE-FLOAT

14 コマンドラインオプションを読み取る

unix-opts などのパッケージでコマンドラインオプションを読み取ることができる.

14.1 unix-opts

TBD

define-opts でオプションを定義し,

;;; opts.ros

(quicklisp:quickload :unix-opts)

;; defining CLI options
(define-opts :name some-option ; mandatory.
             :description "This is test option." ; optional but recommended.
             :short #\o ; can omit if you specify :long
             :long "option" ; can omit if you specify :short
             :meta-var hoge)

著者: Windymelt

Created: 2017-07-16 Sun 03:18

Emacs 24.5.1 (Org mode 8.2.10)

Validate