新千葉 ガーベージ・コレクション

FPGA マガジンやインターフェースで書けなかったこと等をちょぼちょぼ書いてます。@ryos36

2009-10-01から1ヶ月間の記事一覧

どんなコンパイラを目指すのか?

fucc も使えるようになった。勉強という意味では LR と ANTLR(これは LL か) も勉強しなければならにだろうが、LL(1) がわかっていれば実用上差し支えなさそう。さて、いつまでも電卓を作っているわけにはいかないのでコンパイラを作ろうという話になる。最…

fucc での g1, g2, g3

コンパらの構成と最適化にでてくる文法を fucc で軽く書いてみた。 (fucc:defparser *g1* s (+ - * / = :semicolon :id :const #\( #\)) ((s -> expr = :semicolon ) (expr -> expr + term -> term) (term -> term * fact -> fact) (fact -> #\( expr #\) ->…

道具と人間

そういえばイチローが道具を変えない理由を”人間が道具に合わせる必要がある。道具のせいにしないために道具を変えない”なんていっていたけど。職人になると”道具を選ぶ”んじゃなくて”道具に合わせる”んだなぁ〜と深く感心した。今後はラケットのせいにする…

fucc と LL(1) と SICP

fucc で LL(1) の構文解析が出来るようになった。今後は LL と LR の違いをじっくり堪能することになるだろう。最近の時代の流れは LL のようだ。さて、lisper にとって LL とか LR とかって意味があるのだろうか?Lisp ではプログラマ自身が構文解析をして…

Eclipse デプロイできた

どうやら単純ミスだったようで、自分のプラグインを作ってデプロイすることができた。当初は jee でしか動かないのかと思ったが、ちゃんと Java の標準開発環境でも動いた。なんだかね〜〜。Externalize Strings Wizard を使うと国際化もあるていどやってく…

fucc で LL(1)

fucc の作者にメールを出したらちゃんと答えが返ってきた。fucc のサンプルももらった。 #-:fucc-generator (asdf:operate 'asdf:load-op :fucc-generator) #-:fucc-parser (asdf:operate 'asdf:load-op :fucc-parser) (in-package :fucc-generator) (defun …

Eclipse

Eclipse でうまくデプロイできない。理由はわからない。

コンパイラ・コンパイラ

「マイクロコンピュータのためのコンパイラ・コンパイラ―コンパイラ自動生成にむけて 」LL(1) について読みやすく書いていると思う。ただ、高い割には後半(よんでないけど)coco についての話なので「どうでしょう?」という感じだ。 LR については別の本を…

LL(1) と電卓

上記の電卓。言語としては LL(1) のようだ。しかし、これを私の直感的な bnf にしてしまうと、うまく LL(1) でアクセプトできるように書けない、、、 E ::= E + T | T T ::= T * F | F F ::= ( E ) | number見たいになってしまう。あるいは、言語プロセッサ…

reader macro

リーダマクロはこり始めると大変。なんだかわけわからんものができる。例えば、set-macro-character これは各キャラクタにアサインされたマクロ定義を変えることが出来る。get-macro-charater で何がアサインされているか見てみよう。 [2]> (get-macro-chara…

vi with LoL

:set lispwords+=defmacro!,dlambda,aletこうするとdefmacro!のときのインデントが defmacro と同じ場所になり気分が良い。あと、LL(1) は解釈出来たが、その後のアクション(意味解析か、、、)に関して LL のときはどう実行していったらいいのか良くわから…

LL(1) 構文解釈できた

とりあえず解釈できた。やはり (setq change nil) が抜けていたのと iconst が抜けていたというバグがあった。それ以外は問題なし。ついでなので簡単なリードマクロを作った。リードマクロを使うと (setq *rules* '#%END program ::= statlist statlist ::= …

言語プロセッサ(久野靖)with bug

この本の LL(1) の lisp プログラムを打ち込む。ひさびさに”打ち込む”という作業をした。最近では大体ダウンロードできるし正誤表もすぐにみれる。打ち込みなどは死語だ。どうも、本に書いてあるとおりに”打ち込む”でも動かないようだ。プログラムをひっくり…

LL(1) 構文

昨年 Lisp で書いた LL 構文解析のプログラム(といってもたいしたことはしていない)を掘り起こした。言語プロセッサ(久野靖)の本をちょこっと改良しただけのもの。この本、common lisp を使った実際の動作を中心にしていて、 first, follow などの他の構…

verilisp

verilisp なるものを発見した。早速使ってみよう。 http://home.comcast.net/~faulkner612/programming/verilisp/

回路シミュレータ without LoL

結局、LoL の alet や dlambda を使わずに再度書き直した。struct をつかった。これにより SICP の関数を返す関数であったり、クロージャーというのは使わなくなった。いいかどうかわからない。たぶん良い方向に舵を切ったと今の時点では思っている。インタ…

せかいのなべあつ

(defun ahop (n) (let ((n0 (mod n 10))) (cond ((= 3 n0) t) ((<= n 9) nil) (t (ahop (floor n 10)))))) (defun aho3 ( cur end_1 &optional ln ) (if (>= cur end_1) (nreverse ln) (let* ((mf3 (= (mod cur 3) 0)) (ahof (or mf3 (ahop cur)))) (setf ln…

没アイデア

没になったアイデア。複雑すぎるだろう。 (defmacro def-s (var &key force-def-as-variable ) `(flet ((my-func (x) (format t "myfunc ~a~%" x))) (if ,force-def-as-variable (if (fboundp ,var) (error (format nil "var is already defined ~s" ,var)) …

make-XXXXX と def-XXXXX

SICP の場合 (set! x (make-wire)) とするので関数の名称は make でよかった。マクロを使った場合 (make-wire x) これはちょっとおかしい。common lisp でも (setf a (make-array 3)) だ。struct の生成の場合 (defstruct my-d m-v) だ。したがって、この場…

回路シミュレータ完成

おおげさだが、SICP の回路シミュレータが common lisp で動くようになった。SICP にあった reset はあえて入れていない。full-addr まで動いた。さて、LoL の defmacro! 使いどころが難しい。LoL でも必要のないところは defmacro (!がない普通の defmacro)…

せかいのなべあつ

3の倍数のときにあほになって5の倍数のときに犬になります。 3がつくときにあほになるというバリエーションもあるな。 (defun ahowow ( cur end_1 &optional ln ) (if (>= cur end_1) (nreverse ln) (let ((mf3 (= (mod cur 3) 0)) (mf5 (= (mod cur 5) 0…

lysp

lysp なるものを発見した。ものすごく小さい。dlsym を巧妙に使っている。 (define exit (dlsym "exit")) (exit 0) libc にあるものならある程度 mapping できるぞ。 (define printf (dlsym "printf")) printf もこの通り。これでこのサイズ size -x lysp te…

alet もつかう

(defmacro make-wire (var) `(if (fboundp (quote ,var)) (princ "error!!!") (setf (symbol-function (quote ,var)) (alet ((signal-value) (action-procedures)) (dlambda (:get-signal () signal-value) (:set-signal (new-value) (if (not (eq signal-va…

dlambda meets SICP

SICP のディジタル回路のシミュレータってのを common lisp 上にポーティングしようと試みている。まずは make-wire からだ。LoL を読んだ直後だったので dlambda が使えると直感的に思い試して見る。 (let ((signal-value) (action-procedures)) (dlambda (…

一発ではないが

多少小さくなった。ハードコーディング気味。なぜ?おそらく foreach という発想から抜け出さないとうまくかけないのだろう。私は抜け出せていない。 (asdf:oos 'asdf:load-op 'cl-ppcre) (defun my-file-input () (with-open-stream (stream (open "yanau_c…

yaneu.lisp

できました。cl-ppcre つかったら一発だったりして。 (asdf:oos 'asdf:load-op 'cl-ppcre) (defvar xoutput 'nil) (defvar youtput 'nil) (defvar all-output 'nil) ;(setf wq (string #\")) ;(setf wq (coerce wq 'string)) (defun |#%-reader| (stream sub…

直積を求める

foreach 的な発想がやっぱりミスリード。直積を求めるのが先決だ。 (setf pt0 '("XXX" ("x_A" "x_B" "x_C"))) (setf pt1 '("YYY" ("y_A" "y_B" "y_C"))) (defun make-pair (pt) (let ((src (car pt)) (ln-dst (cadr pt))) (mapcar (lambda (x) (list src x))…

といいつつ

システム側で最適化は断念、、、(あきらめがはやいな)しかし、scheme のソースを最適化すると、87572 あった alloc 回数が 22053 に激減。よーく考えてみると、単に自分の scheme がださいだけだが。

GC 完成

もうチョイテストしなきゃならんが GC 完成。割と省メモリですんだと思う。GC の閾値を 0.3(low_water) と 0.6(high_water) にした。low_water を越したら同じメモリサイズで Copying GC。high_water をこしたら倍のメモリをとる。100% とになったら、ちょっ…

テニス

手首をいためたので一週スキップして久々にラケットを握る。やっぱだめじゃん。痛い。っていうかキーボード入力にも響く。しばらくやすまんとなぁ〜〜。