LISP

make-concatenated-stream

めもめも。 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…

hash table操作めも

要素を引っ張り出すための関数&マクロのメモ。 ;; 適当なサンプルデータ 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 マク…

Lispのくせに

ただのお遊び。 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) ] =…

with-gensyms

clispのgen-symsマクロは、生成するシンボル名が第一引数で、gen-symsで生成されるシンボルが格納される変数名は、第二引数以降が該当するみたい。(defmacro (prefix &rest sym-names) &body body)みたいな、シグネチャーで定義されているみたい。 実践Commo…

variable capture

マクロの(意図せぬ)変数捕捉について。 ケース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の違い

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 (+ …

backquote

バッククォートの練習。 入れ子になった時の動きがいまいち分かってない。 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のfill-pointerって何に使うの?死ぬの?と思ってたけど、vectorをスタックのように扱う際に力を発揮するんですね。 しかしmake-array関数が思ったより複雑なので日記にメモ化しましょうという。

destructuring-bind

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 …

実践Common Lisp

http://ssl.ohmsha.co.jp/cgi-bin/menu.cgi?ISBN=978-4-274-06721-1 Practical Common Lispの日本語版が出るらしい!(7/31?) 英語版は全文が公開されているのでちょびちょび拾い読みしてましたが(特にChapter22 w)、いずれ買おうと思ってたところでした…

mapとfilterとリスト内包

PHP Array ( [0] => 1 [1] => 2 [2] => 4 [3] => 8 [4] => 16 [5] => 32 [6] => 64 [7] => 128 …

Meadow + SLIME

http://d.hatena.ne.jp/macLisper/20070604/1180945094 http://d.hatena.ne.jp/BlacksmithMirai/20080130/1201658045

畳み込み - fold(l|r), reduce

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

Why Functional Programming Matters

先日の関数型言語勉強会@北海道で「なぜ関数プログラミングは重要か」を印刷したプリントを全員に配布していました。カフェとかでも気軽に読めて重宝しました。笑 うちにも一応プリンタあるんだけど、超古くて動作遅いし、ヘッドクリーニングしても謎の線(…

ちょっと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…

On Lisp復習

5.5 Cdr部での再帰 マクロの方が良かったり、末尾再帰に及ばなかったりするので、プロトタイプや速度が重要でない場面で用いれとのこと CL-USER 1 > (defun lrec (rec &optional base) (labels ((self (lst) (if (null lst) (if (functionp base) (funcall b…

On Lisp復習

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…

On Lisp 復習

つづき(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!)…

partial application

Python2.5でfunctoolsというモジュールが加わったらしい。全体は眺めてないけど,関数の部分適用とかできるみたい。 >>> from functools import * >>> def foo( x, y, z ) : ... return x + y + z ... >>> add5 = partial( foo, 5 ) >>> add5( 2, 3 ) 10 >>>…

On Lisp 復習

自分用メモのつづき。(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)) …

On Lisp復習

4章に大量に載ってるユーティリティ関数を早く復習しちゃわないと。。 例のごとく書籍とは完全一致してません。 4.3 のつづき(d:id:Nobuhisa:20071128:1196180768) CL-USER 1 > ;; 簡易版 (defun flatten1 (x) (mapcan #'(lambda (x) (if (atom x) (list x) …

loopマクロ

Common Lispのloopマクロは大変気持ち悪いので好きになりそうです。 一度じゃ覚えられないだろうからメモ。

JavaScript風の代入

特に意味はありません。 むしゃくしゃしてやった。 (defmacro var (name dummy= v) (when (not (eq '= dummy=)) (error "!!!")) `(setf ,name ,v) ) (var a = 256) (var b = (expt 2 8))

On Lisp復習

自分用

newLISP manual

旧PCを漁っていたらnewLISPというやつがインストールされていた。 そういえばそんなのもあったなぁ。。。(忘却 http://www.newlisp.org/downloads/manual_frame.html