プログラム
SICP 3.1.2節のために。 (define (shift-32bit n count) (logand (ash n count) #xFFFFFFFF)) (define (make-xorshift-rand x y z w) (lambda() (let ((t (logxor x (shift-32bit x 11)))) (begin (set! x y) (set! y z) (set! z w) (set! w (logxor (logxor…
gearsを移植。frame rateの表示とか、物体の回転とかは省いている。物体の回転は、quaternionで実現する予定。 {-# LANGUAGE TypeFamilies #-} import System import List import Control.Monad import Control.Monad.Trans import Data.IORef import Data.T…
Quaternionをつかって物体の回転を行うプログラム。 3D‐CGプログラマーのためのクォータニオン入門―「ベクトル」「行列」「テンソル」「スピノール」との関係が分かる! (I・O BOOKS)の付録の移植。 LinearSpace -> Quaternionとクラスを積んでいく。 LinearS…
簡単な習作 import qualified Data.Vector as V import Data.Tensor main :: IO () main = do V.mapM_ createFrame tIndices where l :: Float l = 0.5 vertexData::V.Vector (Vertex3 Float) vertexData = V.fromList [ Vertex3 (-l) (-l) (-l), Vertex3 l …
Haskellで2次元格子ランダムウォークを書いてみた。 全然、Haskellで書いた気がせず不満。 IOと評価を分けたいが次の課題。 import Data.IORef import Control.Applicative import Data.Foldable import System.Random.Mersenne import System.Exit (exitWit…
Scalaで図形言語に挑戦してみた。まだ、Scalaってコードではないけど…。 まずはベクトルClass // Vector2d Class // newを省くためにcase classにする。 case class Vector2d(xVal: Double, yVal: Double) { val x: Double = xVal val y: Double = yVal over…
HaskellでGUIに挑戦してみた。gtk2hsとcairoでSICPの図形言語に挑戦。 まずは、簡単なベクトル演算のclass data Vector2d = Vector2d { xcor :: Double, ycor :: Double } deriving (Show,Eq) instance Num Vector2d where (+) v1 v2 = Vector2d { xcor = xc…
高階関数版とWindowsSizeが可変しても、サイズに合うように。 --waveModify.hs --SICP 図形言語 --Window Sizeが可変可能であることに対応 --高階関数版 import Vector import Graphics.UI.Gtk as Gtk import Graphics.Rendering.Cairo as Cairo data Frame …
OSはLinuxと言うことでメモがわりに。まずは、対象となる定番のHello World HelloWorld.scala object HelloWorld { def main(args: Array[String]):Unit = println("Hello World!!!") } Manifest.mf Manifest-Version: 1.0 Main-Class: HelloWorld Class-Pat…
この年末にHaskellプログラムの環境を整えたけど、仕事で書くコードでおなかがいっぱいで手が出ない。 C言語も極めればDeepですが、ちょっと厭き気味。
移動中はHaskellをかじってみる。Lispより直感的で、記号操作的にかけるので楽しい言語。 あと、型の制約が厳しいのでデバッグしやすい。 高級言語での型制約の重要性がよくわかる。普段はC言語せいぜいC++までなので、 いろんな意味で新鮮。ちなみに参考書…
朝起きて、走りにいこうと思ったが、眠気に負ける。朝、嫁さんを見送った後、横になっていたら寝てしまい気づいたら昼過ぎ。 その後、確率過程と量子力学を少し勉強して、プログラム。OSのメモリ管理を考えているが、色々考えると面倒。単純に作った方がいい…
GWでやったこと。 ・AT互換機をブートさせて、Protect modeにして、FATからelfファイルを読み込んで実行。 ・量子論の基礎―その本質のやさしい理解のために (新物理学ライブラリ)を使っての勉強を開始。 ・確率過程の勉強。 結局は、天気に負ける。
(define (split b1 b2) (lambda (painter n) (if (= n 0) painter (let ((smaller ((split b1 b2) painter (- n 1)))) (b1 painter (b2 smaller smaller))))))
(define (up-split painter n) (if (= n 0) painter (let ((smaller (up-split painter (- n 1)))) (below painter (beside smaller smaller)))))
(define (accumulate-n op init seqs) (if (null? (car seqs)) '() (cons (accumulate op init (map (lambda (s) (car s)) seqs)) (accumulate-n op init (map (lambda (s) (cdr s)) seqs)))))
(define (deep-reverse items) (define (iter dst src) (if (null? src) dst (let ((leaf (if (pair? (car src)) (deep-reverse (car src)) (car src)))) (iter (cons leaf dst) (cdr src))))) (iter (list) items))
(define (reverse l) (define (iter dst src) (if (null? src) dst (iter (cons (car src) dst) (cdr src)))) (iter (list) l))
(define (below painter1 painter2) (let ((split-point (make-vect 0.0 0.5))) (let ((paint-top (transform-painter painter1 split-point (make-vect 1.0 0.5) (make-vect 0.0 1.0))) (paint-bottom (transform-painter painter2 (make-vect 0.0 0.0) (ma…
まずは、再帰的手続きで。 (define (cont-frac n d k) (define (iter i) (if (= i k) (/ (n i) (d i)) (/ (n i) (+ (d i) (iter (+ i 1)))))) (trace iter) (iter 1)) つぎに、反復的手続きで (define (cont-frac n d k) (define (iter result i) (if (= i 0…
再び書いてみたら、以前書いたものと違っていた。 (define (fast-expt b n) (define (fast-expt-iter a b n) (cond ((= n 0) a) ((even? n) (fast-expt-iter a (square b) (/ n 2))) (else (fast-expt-iter (* a b) b (- n 1))))) (fast-expt-iter 1 b n)) (…
の変換なので、ベクトルで表すと、 から は,からベクトルで表すと、 から、対数的ステップ数の手続きは、 (define (fib n) (fib-iter 1 0 0 1 n)) (define (fib-iter a b p q count) (cond ((= count 0) b) ((even? count) (fib-iter a b (+ (* p p) (* q q)…
プログラミングGaucheを買ったのに触発されて、また始めることに。改めて1章から。結構、身についているじゃないの?
# losetup -o 32256 /dev/loop0 hda.img # mount -t vfat /dev/loop0 /mnt # cp kernel.elf /mnt # qemu -hda hda.img qemuが起動して、 grub> root (hd0,0) grub> kernel /kernel.elf grub> boot で起動。
SICPがなかなか進みません。仕事のプログラミングの時間を割くわけにも行かないし。 かといって、物理と数学の時間を割きたくないし・・・。 これもGWの企画にひとつにあげとくか・・・。
今年のGWは遠出できなさそうなので、家で何かしようと思っている。 候補は、 簡単なOSを作る。 JTAGケーブルを作って、遊び倒す。 理論電磁気学をできる限り読み続ける。 だが、JTAGケーブルが第一候補かな?
日本語訳の計算機プログラムの構造と解釈を買ってしまいました。 社会人の時間のなさに負けました。
ヒントより、 と成るような状態遷移を考える。 で、nが奇数のときaに押しつける。 (define (even? n) (= (remainder n 2) 0)) (define (square a) (* a a)) (define (fast-expt-iter b n a) (cond ((= n 0) a) ((even? n) (fast-expt-iter (square b) (/ n 2…
Pascalの三角形を頂点の数から添え数を次の様に振ってみる。 とすると の関係があることがわかる。 でのときは1なので再帰的プロセスで記述した場合 (define (pascal_term n m) (cond ((> m n) (display "invaild arg")) ((= m 0) 1) ((= n m) 1) (else (+ (…
組み込みのプログラムで一回のそれほど精度を要求されなlog計算で、 mathライブラリを入れるのも癪なので、以下のような近似を使った。 幸いにして、平方根を求める命令があったので。2048乗根は11回平方根を繰り返すことで求める。