Shibuya.list TT #4に行ってきました
Lisp入門
- 広域変数定義はdefine
(+ 1 2)
この+は演算子ではなく関数
- 広域変数定義はdefine
(define a 1)
- 変数上書き
(set! a (+ a 1))
set!は変数上書きkk
- ローカル変数
(let ((x 1) (y 2) (+ x y)))
- 関数定義もdefineで
(define (add3 n ) (+ n 3))
nは引数
(+ n 3)は関数本体
-
- > function add3(n){return n+ 3 }のようなもの
- quote
(quote (add3 1)) -> 省略 -> '(add3 1)
quoteで定義した式は値として認識される
"実行されない"
- シンボルa,b,cってなに?
- 変数や関数名のようなもの
- carとは
(car '(1 2)) 1
S式の先頭の要素が出力される
- cdrとは
(car '(1 2)) 2
S式の先頭の要素を除いたものが出力される
- consとは
聞き逃した。。。
- 階乗計算をしてみよう
(define (fact n) (if (= n 0) 1 (* n (fact (- n 1)))))
if関数の第一引数は条件、第二引数は 条件に合致した場合の処理(この場合は1) 第三引数は条件に合致しない場合の処理
- S式をhtmlにコンバートする関数を作ってみよう
(define (print-html e) (if (list? e) (begin (format #t "<~a>" (car e)) (print-html-list (cdr e)) (format #t "</~a>" (car e))) (display e)));S式ではなかったら出力 (define (print-html-list l) (if (null? l) (begin (print-html (car l)) (print-html-list (cdr l)))))
- マクロ
????
あとで勉強する
- マクロと関数どっちが早いか
- コンパイル式のCommon Lisp等はマクロの方がはやいが処理系による
開会宣言
卒論で作ったMicro Lisp(1976)
- intel 8080 上で動作する極小Lisp
1980年ころのLisp事情
1980年ころの日本のコンピュータ事情
1980年ころの日本のLisp事情
-
- 中西 慶応 KLISP (TOSBAC 3400)
- 安井 阪大 OLISP(NEAC)
- 竹内、奥乃 NTT LIPQ ,LIPX(PDP-11)
- 後藤、金田 東大 HLISP( HITAC 8800/8700)
UtiLisp
[http://gps.tanaka.ecc.u-tokyo.ac.jp/wadalabfont/pukiwiki.php?UtiLisp/C:title=UtiLisp( University of Tokyo Interactive Lisp)]
- > utile = useful
各種の機能を整合性よく提供
-
- 個別な機能とせず、なるべく一般化、ユーザ定義可能に
- 可能なところは全て暗黙のprognに
- 使いやすさを重視
- オプショナル引数
- マクロ機能
- catch-throw
- インタプリタ当基本部をアセンブラで(1980/7~12)
- データ型の表現
- 基本的にはポインタタグ
- ポインタのさす先のデータ型をポインタ内にもつ
- 上8bitは型情報、残り24bitがアドレス
- データ型の判定にメモリAddressが不要
- 基本的にはポインタタグ
- 組み込みデータ型
- タグ(型情報)割り当て
- signかunsignかを上手に割り当て
atom(x):x >= 0
symbolp(x):x>=7000
質問
- UtiLispのNILはどのように表現
- atomとして実装
- 30年も前の実装のことをどのように思い出したか
- kUtiLispで満足いかなかったところ
- 現在だったらポータビリティを重視してただろう
- Common Lispの評価は?
- Common Lispが出たときには既にLisp開発者じゃなかったので 評価できないが、
- 機能がたくさんついているが、それを誇示しているような印象をうけた
- collerは何個渡すか知っている,colleeは引数何個が最大化を知っている
ここで電池切れ
感想
- Lispってlambdaというものさえあれば条件分岐も繰り返しもかけてすごい
- 数もlambdaであらわせる->チャーチ数
- 本体部分のimplementは意外と簡単に実装できるらしい