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