d. - e. 予定
d. Haskell 旧資料 http://kaz.cyteen.nagoya-bunri.ac.jp/advprog2/haskell.html
関連資料 Haskell基礎文法最速マスター
課題 文字列の難読化 と 不要文字の除去
文字列 abcdefg に対し、 a.b.c.d.e.f.g. の様に1文字ずつ 記号を入れて区切るプログラムを作成する。
ヒント: ['.' ..] 無限リスト と、リスト操作関数 zip の利用など。
main = print $ zip "hello" ['.', '.' ..]
main = print $ map (\x -> (fst x):(snd x):[]) $ zip "hello" ['.', '.' ..]
main = print $ foldl (++) "" $ map (\x -> (fst x):(snd x):[]) $ zip "hello" ['.', '.' ..]
main = print $ concat $ zipWith (\x y -> x:y:[]) "hello" (repeat '.')
e. LISP 旧資料 http://kaz.cyteen.nagoya-bunri.ac.jp/advprog2/lisp.html
・UEI shi3zの日記 これがプログラミングの神髄だ! ファイナルファンタジーのプログラマーが明かす秘密とLispトークバトル!
・On Lisp http://www.asahi-net.or.jp/~kc7k-nd/onlispjhtml/ Web私訳版
amazon On Lisp
演習内容概要:
・数値 整数(多倍長計算) 分数型
・クオート記号 '
・リスト
car cdr cadr ....
・cond 文
nil と '() の扱い
・lambda 式
(defun double (x) (* x 2))
(double 2)
((lambda (x) (* x 2)) 3)
(mapcar #'(lambda (x) (+ x 10)) '(1 2 3))
問題1: 2乗のリストを作成するは?
・クロージャ
(defun make-adder (n)
#'(lambda (x) (+ x n)))
(setq add2 (make-addder 2))
(setq add10 (make-adder 10))
(funcall add2 1)
(funcall add10 2)
問題2: make-multi で掛け算バージョンを作成する。
・末尾再帰
(defun our-length (lst)
(if (null lst)
0
(1+ (our-length (cdr lst)))))
(defun our-find-if (fn lst)
(if (funcall fn (car lst))
(car lst)
(our-find-if fn (cdr lst))))
問題3: 上記の our-find-if を mapcar を利用して解決する。
・マクロ
バッククオート式
(defun hello (x) (list 'Hey x))
(hello 'koba)
(defun greet (name)
`(hello ,name))
(greet 'koba)
(defmacro greet (name)
`(hello ,name))
(greet 'koba)
(defmacro greet (name)
`(list 'hello ',name))
(greet koba)
問題4:
式を引数とし、その式を表示して、式の計算結果も表示するプログラムの作成。
(defmacro cl (x) `(progn (print ',x) ,x))
(cl (+ 1 2))
他の候補:
・Processing で generative CG
・github で コード管理
今年は諦め:
・MAX/MSP