2010-08-01から1ヶ月間の記事一覧

簡単な文脈自由言語パーサ&コンバータ

文脈自由言語を解釈して Lisp の式に直す、簡単なパーサとコンバータを作ってみた。きっかけは以下の記事。 最高にキモい Lisp コードを書いてみよう with 100 行リーダーマクロ(LISPMEMO) 自分でもできるんじゃないかと思ってやってみたら一応できた、とい…

リード・マクロ遊び

まずは否定関数の生成。 (defun |#~-reader| (stream subchar numarg) (declare (ignore subchar numarg)) `(complement #',(read stream t nil t))) (set-dispatch-macro-character #\# #\~ #'|#~-reader|) CL-USER> #~oddp #<Closure (:INTERNAL COMPLEMENT 0) @ #x2085f112> CL-USER> (funcall #~oddp 2) </closure>…

重複のあるオブジェクトを抜き出す関数

「重複を取り除くとか。」(http://d.hatena.ne.jp/narumij/20100603/1275527119) 重複のあるオブジェクトをそれぞれ1つずつ抜き出す関数。 やってみた! コード: (defun overlap (list &optional (test #'eql)) (labels ((rec (ls acc) (if (cdr ls) (if…

cl-ppcre と Allegro CL で、正規表現ツリーの出力が違った

題名のとおり。文字列で表された正規表現パターンをパースしてツリーにする関数がどちらにもあるのだが、まったく同じ出力をするのかと思っていたらこんな違いが。 CL-USER> (parse-string "ab") ; cl-ppcre "ab" CL-USER> (parse-re "ab") ; Allegro CL (:S…

文字列の中で式を評価、展開するリーダ・マクロ

Gauche では、Perl や Ruby と同じように、文字列の中で式を展開することができるらしい。 →文字列の補間(Gauche ユーザリファレンス) そこで、似たようなものを Common Lisp でやってみた。 コード: (defun concat-chars (ls) (if (null ls) nil (let ((…

loop マクロの変数キャプチャもどき

つい昨日知った機能。loop マクロの if, when, while では、テスト部分の値を it で参照できる。 この it は変数ではなく、あくまでも collect などと同じキーワードであるため、剥き出しで使わないと効果はない。 CL-USER> (defun trues (fn ls) (loop for …