Scheme 100までの素数列挙
いちおう末尾再帰してるはずです… (Schemeで本当に末尾再帰してるかどうか調べるにはどうすればいいだろう?)
(define (erathos upper-bound) (define (iter-erthos x xs) (define (divine? a) ((compose zero? modulo) x a)) (if (> x upper-bound) xs (if (null? (filter divine? xs)) (iter-erthos (+ x 1) (append xs (list x))) (iter-erthos (+ x 1) xs)))) (iter-erthos 2 '(2))) (erathos 100)
δ簡約
Lispだとネイティブなサブルーチンまでの簡約のこと
実行と評価
print :: Show a => a -> IO () print = putStrLn . show
print (putStrLn "foo")
はIOをかえす
評価されると実行されるは嘘。
評価と実行は別
DClean
http://dragon.ektf.hu/dclean/
shelercyさんから教えてもらった
main = putStrLn "foo" `seq` "bar"
左は評価されない。
Object id がない。ポインタがない。
newがないので同一かどうかどでもいい
memomizeのとき困る。treeを全部たどってしまう。
Basicの処理系を作るのは難しいらしい。"go Sub"の実装が難しいそうだ
誤植ドットが余計
match pattern = any (pattern `isPrefixOf`) . tails
Kernel読書会
先日カーネル読書会なるものにいってきました。
alternativeマクロ話だそうです。
sfence,lfenceという最近?の命令をサポートしていない、CPUのため互換性を持たせるマクロだそうです。
このsfence,lfeceというのはメモリにたいしてロード、ストアの実行順序を決めるためにあるのですが。
なんでこんなものがあるかと言う、マルチプロセッサ環境のせいでして、
並列実行する時の高速化で、依存関係のない命令を実行準備のできたものから次々に実行させるわけなんです。
このとき実行順序が決まってないといけない命令はそうされては困るので、そのことをCPUに伝えるために存在するという事だとおもいます。
以下を参照
http://ja.wikipedia.org/wiki/%E3%82%A2%E3%82%A6%E3%83%88%E3%83%BB%E3%82%AA%E3%83%96%E3%83%BB%E3%82%AA%E3%83%BC%E3%83%80%E3%83%BC%E5%AE%9F%E8%A1%8C
で、このマクロがなにをしてるかと言うと前述の命令をサポートしてないCPUのためにカーネルが初期化される時に
命令自体を書き換えるということを行っているそうです。
で、何をやってるかと言うと同期をとらせるためにnop命令で埋め尽くすみたいなことをやってるそうです…
http://mkosaki.blog46.fc2.com/blog-entry-166.html
ふつハスとどいた
Clean パスカルの三角形
Cleanにないので、zipWithは別途定義
Start = take 10 pascal where pascal = [ [1] : [zipWith (+) [0:xs] (xs++[0]) \\ xs <- pascal] ]
追伸id:lethevertさんからStdLibをimportすればzipWithは使えると情報が。
ありがとうございます。