Lisp,Scheme

関数型言語の特徴 Lisp版

CL-USER> (defclass SomeBean() ((firstName :accessor firstName :initarg :firstName) (lastName :accessor lastName :initarg :lastName) (age :accessor age :initarg :age))) #1=#<STANDARD-CLASS SOMEBEAN> CL-USER> (setf sb (make-instance 'SomeBean :firstName 'hiroshi :la</standard-class>…

マクロに関する浅すぎるメモ

遅延評価が基本の言語ならLispで言うところのマクロ機構は不要なのかな?

On Lisp 4.3 リストに対する操作

CL-USER> (proclaim '(inline last1 single append1 conc1 mklist)) NIL CL-USER> (defun last1 (lst) (car (last lst))) LAST1 CL-USER> (setf lst '(a b (c d))) (A B (C D)) CL-USER> (last1 lst) (C D) CL-USER> (last lst) ((C D)) ふむ、last1は括弧を…

mapcan

平坦なリストを返すが破壊的な操作

On Lisp 3.4 インタラクティブプログラミング

Lispの重要な要素は、どこを取ってもS式で どこを取っても評価できるということだと思う。でもlet等による束縛を前提にしている後続のS式も あるはずなので、例えばファイルI/OやDBアクセスなどの 副作用を伴わないS式も単純には即評価できない場合も…

On Lisp 3.3 関数型インタフェース

破壊的な関数は必ずしも悪ではなく 関数内部など、破壊的な副作用がローカルで済むのであれば 使ってもよいという話。 だと思う。

On Lisp 3.2 命令型プログラミングの裏返し

CL-USER> (defun fun (x) (list 'a (expt (car x) 2))) FUN CL-USER> (defun imp (x) (let (y sqr) (setq y (car x)) (setq sqr (expt y 2)) (list 'a sqr))) IMP CL-USER> 命令型で書いたプログラムを変数を使わない形式で 関数型に変換していく。 JavaやC…

On Lisp 3.1 関数型のデザイン

; SLIME 2005-12-27 CL-USER> (defun bad-reverse (lst) (let* ((len (length lst)) (ilimit (truncate (/ len 2)))) (do ((i 0 (1+ i)) (j (1- len) (1- j))) ((>= i ilimit)) (rotatef (nth i lst) (nth j lst)) ))) BAD-REVERSE CL-USER> (setf lst '(a b…

On Lisp 2.9 コンパイル

CL-USER> (defun foo (x) (1+ x)) FOO CL-USER> (compile 'foo) FOO NIL NIL CL-USER> (proclaim '(inline foo)) NIL CL-USER>

On Lisp 2.8 末尾再帰

累積変数を再帰で渡して、最後の基底部で結果を返すようにする。

On Lisp 2.7 ローカル関数

CL-USER> (mapcar #'(lambda (x) (+ 2 x)) '(2 5 7 3)) (4 7 9 5) CL-USER> (mapcar #'copy-tree '((a b) (c d e))) ((A B) (C D E)) CL-USER> (labels ((inc (x) (1+ x))) (inc 3)) 4 CL-USER>

On Lisp 2.6 クロージャ

CL-USER> (defun list+ (lst n) (mapcar #'(lambda (x) (+ x n)) lst)) LIST+ CL-USER> (list+ '(1 2 3) 10) (11 12 13) CL-USER> (let ((counter 0)) (defun new-id () (incf counter)) (defun reset-id () (setf counter 0)) ) RESET-ID CL-USER> (new-id)…

On Lisp 2.5 スコープ

CL-USER> (let ((y 7)) (defun scope-test (x) (list x y)) ) SCOPE-TEST CL-USER> (let ((y 5)) (scope-test 3) ) (3 7) CL-USER>

On Lisp 2.4 属性としての関数

CL-USER> (defun behave (animal) (case animal (dog (wag-tail) (bark)) (rat (scurry) (squeak)) (cat (rub-legs) (scratch-carpet)) )) BEHAVE CL-USER> (defun behave (animal) (funcall (get animal 'behavior))) BEHAVE CL-USER> (setf (get 'dog 'beh…

On Lisp 2.3 関数を引数にする

CL-USER> (+ 1 2) 3 CL-USER> (apply #'+ '(1 2)) 3 CL-USER> (apply (symbol-function 'x) '(1 2)) ; No value CL-USER> (apply (symbol-function '+) '(1 2)) 3 CL-USER> (apply #'(lambda (x y) (+ x y)) '(1 2)) 3 CL-USER> (apply #'+ 1 '(2)) 3 CL-USE…

On Lisp 2.2 関数の定義

; SLIME 2005-12-27 CL-USER> (defun double (x) (* x 2)) DOUBLE CL-USER> (double 1) 2 CL-USER> #'double #<FUNCTION DOUBLE (X) (DECLARE (SYSTEM::IN-DEFUN DOUBLE)) (BLOCK DOUBLE (* X 2))> CL-USER> (eq #'double (car (list #'double))) T CL-USER> (lambda (x) (* x 2)) #<FUNCTION :LAMBDA (X) (* X 2)> CL-USER…</function></function>

サンプル求め

本屋に行って人工知能系の本をパラパラと捲ってみたが、Lispを使ってる本が見当たらないような…

目標

LispやSchemeを勉強することで到達したい目標がある。 それはScheme:Schemeプログラマのレベル10における レベル6 日常の処理を自動化するSchemeプログラムを書きはじめる。 レベル7 仕事で納入した例のJavaプログラムが実はSchemeによって生成されたもので…

実践 Common Lisp を読み始めた。

何冊か読んでからなので、前に読んだ時よりも 理解できる箇所が多くなってる。まだまだわからないけど。

ファイルに書いてみる 初めての人のためのLISP P.247

CL-USER> (setf s (open "c:\setup2.log" :direction :output)) #<OUTPUT BUFFERED FILE-STREAM CHARACTER #P"C:setup2.log"> CL-USER> (write-char #\A s) #\A CL-USER> (close s) T</output>

ファイルを読んでみる 初めての人のためのLISP P.238

Cドライブ直下にある、こんなファイル C:\setup.log [InstallShield Silent] Version=v7.00 File=Log File [ResponseResult] ResultCode=0これをLispで読んでみる CL-USER> (setf s (open "c:\setup.log" :direction :input)) #<INPUT BUFFERED FILE-STREAM CHARACTER #P"C:setup.log" @1> CL-USER> (read s) [INSTALLS…

継続って

プログラミングGaucheの継続を読んでみたけど、継続ってUnixコマンドのパイプとか、Haskellのモナドを連鎖させて行くイメージに近いのだろうか? しかし処理をレジュームしたりするのは面白いかも。 これが関数呼び出しのタイミングだけでなく、処理中の任意…

魔法言語 リリカル☆Lisp Free の第7話

letはlambdaの糖衣構文ですか・・・ これがlet over lambdaのことなのかな? (define l (lambda (x) (if (null? x) 0 (+ 1 (l (cdr x))))))

魔法言語 リリカル☆Lisp Free の第6話

condバージョン (define s (lambda (n) (cond( ((= n 0) 0) (else (+ n (s (- n 1)))) ) ) ) ) ifバージョン (define s (lambda (n) (if (= n 0) 0 (+ n (s (- n 1))) )))

魔法言語 リリカル☆Lisp Free

フリー版だとセーブできないのかな?(追記) 7話からはセーブできるみたい?

魔法言語 リリカル☆Lisp Free の第5話

「関数 f を『引数の第二要素を返す関数』として定義しなさい。 ただし、引数は1つで、リストのみが来ると考えていいわ」とのことだけど (define f (x) (car (cdr x))) と回答すると「ちがうわやり直し」と言われ (lambda (x) (car (cdr x))) と回答すると…

魔法言語 リリカル☆Lisp Free の第12話

(define muli (lambda (x y n) (if (null? y) n (muli x (dec y) (add n x))) )) (mul (inc (inc (zero))) (inc (inc (inc (zero)))) )

魔法言語 リリカル☆Lisp Free の第11話

(define map1 (lambda (f l) (if (null? l) '() (cons (f (car l)) (map1 f (cdr l)) ))))

魔法言語 リリカル☆Lisp Free の第10話

今回は練習問題ないけど、 末尾再帰の最適化と、再帰を2段階で書くってのが もしかして継続に繋がっていくのだろうか・・・

魔法言語 リリカル☆Lisp Free の第9話

(define (s n) (si n 0)) (define si (lambda (n x) (if (= n 0) x (si (- n 1) (+ x n)))))