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は使えると情報が。
ありがとうございます。