LISP
めもめも。 make-concatenated-streamを使うと、 複数のストリームを連結して1つのストリームとして扱うことが出来る。 CL-USER> (let* ((s1 (make-string-input-stream "hello")) (s2 (make-string-input-stream ", ")) (s3 (make-string-input-stream "wor…
以下のようなものも一応コンパイル時計算といっていいんだろうか? On Lispにもコンパイル時計算について書かれているけど、それは実行時のリストのコンシングを避けたり、式の変形を工夫したり etc・・・といった感じだった。 ;; 階乗計算関数 CL-USER> (de…
要素を引っ張り出すための関数&マクロのメモ。 ;; 適当なサンプルデータ CL-USER> (setq ht (make-hash-table)) #S(HASH-TABLE :TEST EXT:FASTHASH-EQL) CL-USER> (dolist (x (coerce "my lisp !" 'list)) (setf (gethash x ht) (char-code x)) ) loop マク…
ただのお遊び。 Common Lispのくせにリスト内包表記! CL-USER> [ x | x <- '(1 2 3 4) ] => (1 2 3 4) CL-USER> [ x | x <- '(1 2 3 4 5 6 7 8 9) (evenp x) ] => (2 4 6 8) ;; 条件を複数 CL-USER> [ x | x <- '(1 2 3 4 5 6 7 8 9) (evenp x) (< x 5) ] =…
clispのgen-symsマクロは、生成するシンボル名が第一引数で、gen-symsで生成されるシンボルが格納される変数名は、第二引数以降が該当するみたい。(defmacro (prefix &rest sym-names) &body body)みたいな、シグネチャーで定義されているみたい。 実践Commo…
マクロの(意図せぬ)変数捕捉について。 ケース1 : 引数がうああ! ってなる ;; こんなマクロを定義したとする CL-USER> (defmacro swap (var1 var2) `(let ((temp ,var1)) (setq ,var1 ,var2) (setq ,var2 temp) )) SWAP CL-USER> (setq a 10 b 20) 20 CL-…
labelsは主に関数定義を入れ子にしたい場合に用いますが、fletというものもあるみたい。 外側(defun)と内側(labels,flet)の関数名が同一であった場合、内側の関数で再帰呼び出しをすると果たして誰にお呼びがかかるのか。labelsとfletはその時の振る舞いが異…
CL-USER> (defmethod my-fold (f e (ls (eql nil))) e) CL-USER> (defmethod my-fold (f e ls) (my-fold f (funcall f e (car ls)) (cdr ls)) ) CL-USER> (my-fold #'(lambda (x y) (cons y x)) '() '(5 4 3 2 1)) (1 2 3 4 5) 思いつきでmultimethodsでやっ…
マクロの復習というか練習というかメモというか。 メモ:マクロを呼び出してる関数をコンパイルするとどうなるの 予想通りといえばの予想通りの動作。 式がインライン展開されてると考えてよろしいのでしょうか。 CL-USER> (defmacro foo! (x) `(setq ,x (+ …
バッククォートの練習。 入れ子になった時の動きがいまいち分かってない。 vectorにも使えるとは知らなかった。(文字列はダメだった) CL-USER> (setq a 100 b '(1 2 3)) (1 2 3) CL-USER> `(,a ,@b) (100 1 2 3) CL-USER> `#(a ,a ,b ,@b) #(A 100 (1 2 3)…
リーダーマクロ?リードマクロ? まあとりあえず、リー○マクロを少しだけ触ってみました。 Lispが見かけ上Lispに見えなくなる瞬間。 Lispはカリー化が面倒なのでカリー化を補助するマクロを定義する遊び。 ;; ']' をマクロの文字だと認識させる CL-USER> (se…
make-arrayのfill-pointerって何に使うの?死ぬの?と思ってたけど、vectorをスタックのように扱う際に力を発揮するんですね。 しかしmake-array関数が思ったより複雑なので日記にメモ化しましょうという。
CL-USER 1 > (setq data '(1 (2 . 3) (4) 5 6 7)) (1 (2 . 3) (4) 5 6 7) CL-USER 2 > (destructuring-bind (a (b . c) (d) . e) data (list a b c d e)) (1 2 3 4 (5 6 7)) CL-USER 3 > (destructuring-bind (a (b . c) (d) . e) data (append (list a b c …
http://ssl.ohmsha.co.jp/cgi-bin/menu.cgi?ISBN=978-4-274-06721-1 Practical Common Lispの日本語版が出るらしい!(7/31?) 英語版は全文が公開されているのでちょびちょび拾い読みしてましたが(特にChapter22 w)、いずれ買おうと思ってたところでした…
PHP Array ( [0] => 1 [1] => 2 [2] => 4 [3] => 8 [4] => 16 [5] => 32 [6] => 64 [7] => 128 …
http://d.hatena.ne.jp/macLisper/20070604/1180945094 http://d.hatena.ne.jp/BlacksmithMirai/20080130/1201658045
RubyとPythonの場合 http://d.hatena.ne.jp/nullpobug/20080609/1212994658 Haskellだとfoldl(fold-left)とfoldr(fold-right)らしい。 定義を拾ってきた -- fold-left foldl :: (a -> b -> a) -> a -> [b] -> a foldl f z [] = z foldl f z (x:xs) = foldl f…
>(setq lst '(1)) (1) >(rplacd lst lst) #1=(1 . #1#) >(car lst) 1 >(caddr lst) 1
先日の関数型言語勉強会@北海道で「なぜ関数プログラミングは重要か」を印刷したプリントを全員に配布していました。カフェとかでも気軽に読めて重宝しました。笑 うちにも一応プリンタあるんだけど、超古くて動作遅いし、ヘッドクリーニングしても謎の線(…
ちょっとloop復習。特に意味はない。 CL-USER > (sort (loop for k being the hash-keys in ht using (hash-value v) collect (cons k v)) #'< :key #'cdr) ((ONE . 1) (TWO . 2) (THREE . 3)) CL-USER > (loop with a = (make-sequence 'list 11 :initial-e…
5.5 Cdr部での再帰 マクロの方が良かったり、末尾再帰に及ばなかったりするので、プロトタイプや速度が重要でない場面で用いれとのこと CL-USER 1 > (defun lrec (rec &optional base) (labels ((self (lst) (if (null lst) (if (functionp base) (funcall b…
5.4 関数を合成する CL-USER 1 > (defun compose (&rest fns) (if fns (let ((fn1 (car (last fns))) (rest (butlast fns)) ) #'(lambda (&rest args) (reduce #'funcall rest :from-end t :initial-value (apply fn1 args) ))) #'identity)) COMPOSE CL-USE…
つづき(d:id:Nobuhisa:20080120:1200761083) 5.2 直交性 CL-USER 1 > (defvar *!equivs* (make-hash-table)) *!EQUIVS* CL-USER 2 > (defun ! (fn) (or (gethash fn *!equivs*) fn) ) ! CL-USER 3 > (defun def! (fn fn!) (setf (gethash fn *!equivs*) fn!)…
Python2.5でfunctoolsというモジュールが加わったらしい。全体は眺めてないけど,関数の部分適用とかできるみたい。 >>> from functools import * >>> def foo( x, y, z ) : ... return x + y + z ... >>> add5 = partial( foo, 5 ) >>> add5( 2, 3 ) 10 >>>…
自分用メモのつづき。(d:id:Nobuhisa:20080114:1200338245) ようやく4章のコードひと通り復習でけたー。(掲載するのは一部) 4.5 マッピング (ま!ピングー!) CL-USER 1 > (defun map-> (fn start test-fn succ-fn) (do ((i start (funcall succ-fn i)) …
4章に大量に載ってるユーティリティ関数を早く復習しちゃわないと。。 例のごとく書籍とは完全一致してません。 4.3 のつづき(d:id:Nobuhisa:20071128:1196180768) CL-USER 1 > ;; 簡易版 (defun flatten1 (x) (mapcan #'(lambda (x) (if (atom x) (list x) …
Common Lispのloopマクロは大変気持ち悪いので好きになりそうです。 一度じゃ覚えられないだろうからメモ。
特に意味はありません。 むしゃくしゃしてやった。 (defmacro var (name dummy= v) (when (not (eq '= dummy=)) (error "!!!")) `(setf ,name ,v) ) (var a = 256) (var b = (expt 2 8))
自分用
旧PCを漁っていたらnewLISPというやつがインストールされていた。 そういえばそんなのもあったなぁ。。。(忘却 http://www.newlisp.org/downloads/manual_frame.html