ぱたへね

はてなダイアリーはrustの色分けができないのでこっちに来た

lisp

Lisp interpreter in rust

最近、中国語の勉強ばかりしていたので、リハビリがてらRustでLisp処理系を作る本を買ってみました。 www.amazon.co.jp 多分、本の内容もここにある気がして、買わなくても良かったのではと思うが筆者にお金が入るならOK。 github.com SICPにのっているよう…

Lisp in Small Pieces Exercise 1.6 list

list関数を実装しなさいという問題。これは簡単。 evaluateにlistの分岐を追加 [(list) (let ([args (evlis (cdr e) env)]) (make-list args))] リストを作る関数 ;; list exer 1.6 (define make-list (lambda (args) (if (eq? args '()) '() (cons (car arg…

Lisp in Small Pieces Exercise 1.5 boolean

(defprimitive < < 2) 今の実装だと、schemeの#t, #f を返すので、俺実装系のTrue、Falseを返すようにしなさい。 俺実装系では真偽値として#t, #fではなくt, fを使うようにすると、こう書けます。 (definitial t #t) (definitial f #f) (defprimitive > (lam…

Lisp in Small Pieces Exercise 1.4 shallow binding

Stackを使ったshallow bindingを実装しなさいという問題。 とりあえず実装してみたのですが、練習問題にしてはヘビーでした。https://github.com/natsutan/Lisp_in_Small_Pieces/blob/master/chap1/exer1.4.scm shallow bindingとは 1.6.2 Deep or Shallow I…

Lisp in Small Pieces Exercise 1.3 extend

extendをこのように定義した場合、lookupとupdate!を定義して、元のバージョンと比較しなさい。 (define exntend (lambda (env names values) (cons (cons names values) env))) pass というかリナザウでやるのが辛かったので挫折。 メリットは環境の拡張が…

Lisp in Small Pieces Exercise 1.2 evlis

evilsの最後の再起が無駄なのでなくしましょう。修正前 (define evlis (lambda (exps env) (if (pair? exps) (let ((arg1 (evaluate (car exps) env))) (cons arg1 (evlis (cdr exps) env))) '()))) 修正後 ;exer 1.2 (define evlis (lambda (exps env) (let…

Lisp in Small Pieces Exercise 1.1 Trace

トレース機能を追加しました。 実装してから、出題の意図としては俺言語の方で追加するんじゃないかとも思いましたが、素のSchemeの方で追加できるようにしました。 テストは100点を目指すよりは合格すればOKのタイプ。まずは、トレースON/OFFを制御する信号…

Lisp in Small Pieces 1章

2年半ぶりに勉強を再開しました。 譲っていただいたLinux ZaurusでGaucheを使いながらぽちぽちと入力しています。3回目くらいなので、比較的まっすぐに打ち込むことができました。https://github.com/natsutan/Lisp_in_Small_Pieces/tree/master/chap1各関数…

Lisp in Small Pieces 1.8 Starting the Interpreter

これもよく見る形ですね。 (define (chapter1-scheme) (define (toplevel) (display (evaluate (read) env.global)) (toplevel) ) (toplevel) )

Lisp in Small Pieces 1.7 Global Environment

初期値やデフォルトで使える関数を、Global environment に追加するマクロ (define env.global env.init) (define-syntax definitial (syntax-rules () ((definitial name) (begin (set! env.global (cons (cons 'name 'void) env.global)) 'name ) ) ((defi…

Lisp in Small Pieces 1.6 Representing Function

Lisp In Small Piecesの1.6のまとめ。スコープの所が良くわかっていない。(自作処理系の)関数の実装には、(Schemeの)関数を使うのがよい。最も簡単な実装。 (define (invoke fn args) (if (procedure? fn) (fn args) (wrong "Not a funstion" fn))) 練習…

Lisp in Small Pieces 1.4 Evaluating Atoms

Lisp In Small Piecesの1.4のまとめ。 special form について 厳密にはformで無くてもspecial formと呼ぶ。 この本によると、Schemeは、quote if set! lambda の4つ。Common Lispは30以上のspecial formを持つ。気になって、Scheme処理系の言語リファレンス…

Lisp in Small Pieces 1.3 Evaluating Atoms

やっぱり Lisp In Small Piecesを読むことにしました。評価機の最初の一歩です。Lispの基本的なルールはこの2つです。 変数はシンボルによって表現される 関数適用は、最初の項が適用する関数を表していて残りがその関数に適用する引数を表しているリストで…

Paradigms of Artificial Intelligence Programming のKindle版は買ってはいけない

LL/ML Advent Calendar 6日目の記事です。 12/6日には完成していましたが、あなたが今記事を見ようとした瞬間に記事が文字になり、にインターネットにデータが送られました。遅延評価素晴らしいです。 以前twitterにはつぶやいたのですが、大事な話なのでま…

Land of Lisp

漫画が独特の味を出しているCommon Lispの本、Land of Lispを読みました。とても面白かったので紹介します。 本の内容 ゲームを作りながら、Common Lispや関数型プログラミングについて学べる本です。他の「ゲームで学ぶ・・・」系の本と違うのは、既存のゲ…

LispWorksでレジストリを操作する。

Common Lispでも、Windowsのレジストリを操作したいですよね。LispWorksならレジストリも楽々操作できます。 レジストリの読み出し win32:registry-valueを使います。 (win32:registry-value "\Software\\LispWorks\\LispWorks\\5\\1\\Editor" "Input Format…

LispWorks (Windows) で外部プロセスを起動する

LispWorksのIDEを使っていると、ちょっとディレクトリ作りたいときや、ちょっとファイルを削除したいときに、diredを期待してC-xdを押してしまいます。あまりにも同じミスを何度もするので、LispWorksからWindowsのファイラーが起動するようにしました。 外…

FPGAでLispマシーン

小黒さんによる「Lispマシンを作ってみた」を見ました。なかなか遠くのイベントに参加できないので、録画で後から見れるようになっていると助かります。関係者の皆さんありがとうございました。動画を見てもらえれば分かりますが、FPGAの上でLispコンパイラ…

GIMPを使ってコマンドラインから画像を変換する。

Script-Fuを使いましょう。みんな大好きSchemeです。 GIMPでScript-Fuを使うときの問題点 GIMPでScript-Fuを使うには、Script-Fuのソースを特定のフォルダーに置く必要があります。私の環境ですと、この2つのフォルダーがScript-Fuの置き場になります。 C:\h…

LispWorksにMaximaをインストールする

Quicklisp を使うをみていたら、初期化ファイルの中でmaximaに関する記述がありました。LispWorksでも動きそうなのでやってみました。環境は64bit Windows7、LispWorks Professional Edition 5.1です。まず、http://sourceforge.net/projects/maxima/files/M…

LispWorksでアプリケーションを配布する

LispWorksならCommon Lispで作ったアプリケーションの配布も簡単です。1)lispファイルと同じフォルダーにスクリプトを作るarrow_delivery.lspで保存しました。 (in-package "CL-USER") (load-all-patches) (compile-file "arrow" :load t) ;(load (current-p…

矢印を描く

LispworksにはCAPIというGUIのToolkitが付属しています。 勉強もかねて、ちょっとしたアプリケーションを作ってみました。Lispworksは有料の開発環境ですが、機能制限付きのLispWorks Personal Editionが無料で使用できます。矢印を描くアルゴリズムは、↑矢…

Lispマシーンのマスタークロック生成方法

LispマシーンCADRのクロック生成方法が面白かったのでまとめてみました。回路図(CADR_schematic.pdf)の64ページです。図のpdfはこちら。通常のクロックのように、水晶発振子を使わずに、SRラッチと遅延回路の組み合わせでクロックを作っています。クロックが…

Lispマシーンのclock distribution

LispマシーンCADRのclock distributionを調べてみました。回路図がスキャンしたPDF(CADR_schematic.pdf)しかないので、目で追いかけてみました。苦労した割りにはあまり面白くないですが、途中経過としてまとめてみました。 CADRのクロック分配は、基本的に…

Lispマシーンのマイクロコード

IM-528_CADR.pdfからLispマシーンCADRの命令フォーマットをまとめました。CADRの命令長は48bit+奇パリティで、以下の部分が全命令で共通の仕様になっています。 bit 機能 IR[48] 奇パリティビット IR[47] 未使用 IR[46] 統計用bit(Statistics)。特定エリア…

Lispマシーンの制御パス

AIM-528_CADR.pdfからLispマシーンCADRの制御バスの図を抜き出してみました。中央右側にPC(プログラムカウンター)があります。 普通のプロセッサと明らかに違う所は、ビット幅の違う小さなメモリが複数あることです。PCは14bit幅、スタックは19bi幅t、disp…

Lispマシーンのブロック図

AIM-528_CADR.pdfから、Lispマシーンの機能ブロック図を抜き出しました。回路図が公開されているのはプロセッサとBus adaptor部分です。図を見るとCADRは2つ外部バスを持っています。 1つ目が16bitのバスで、キーボードやマウスが接続されます。UNIBUS COMP…

CADRのデータパス

AIM-528_CADR.pdfからLispマシーンCADRのデータパス(page24a)を抜き出してみました。単純にうつし間違いもあると思うので、気になる人は原文当たってください。 私から見て特徴的な所は大きく2点です。1つ目がALUへの入力がAバスとMバスの2つに分離されて…

cadrのVerilogソースのコンパイル その2

CADRのハードウェアをFPGAに実装した場合、どれくらいの規模になるのかを確かめるためにベンチマークを取って見ました。ダウンロードできるVerilogの回路では、ボード上のメモリがほぼ全てLEに変換されています。外付けのメモリを使う事にし、メモリの記述を…

cadrのVerilogソースのコンパイル その1

http://www.unlambda.com/cadrから入手できるVerilogファイル(CADDR Revised CADR Verilog)からcadr.vと関連ファイルのみで論理合成をしてみました。ターゲットはCycloe3です。論理合成でエラーが出るので、iram(part_16kx49ram)のみ外付けメモリを使う前提…