lisp
最近、中国語の勉強ばかりしていたので、リハビリがてらRustでLisp処理系を作る本を買ってみました。 www.amazon.co.jp 多分、本の内容もここにある気がして、買わなくても良かったのではと思うが筆者にお金が入るならOK。 github.com SICPにのっているよう…
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…
(defprimitive < < 2) 今の実装だと、schemeの#t, #f を返すので、俺実装系のTrue、Falseを返すようにしなさい。 俺実装系では真偽値として#t, #fではなくt, fを使うようにすると、こう書けます。 (definitial t #t) (definitial f #f) (defprimitive > (lam…
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…
extendをこのように定義した場合、lookupとupdate!を定義して、元のバージョンと比較しなさい。 (define exntend (lambda (env names values) (cons (cons names values) env))) pass というかリナザウでやるのが辛かったので挫折。 メリットは環境の拡張が…
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…
トレース機能を追加しました。 実装してから、出題の意図としては俺言語の方で追加するんじゃないかとも思いましたが、素のSchemeの方で追加できるようにしました。 テストは100点を目指すよりは合格すればOKのタイプ。まずは、トレースON/OFFを制御する信号…
2年半ぶりに勉強を再開しました。 譲っていただいたLinux ZaurusでGaucheを使いながらぽちぽちと入力しています。3回目くらいなので、比較的まっすぐに打ち込むことができました。https://github.com/natsutan/Lisp_in_Small_Pieces/tree/master/chap1各関数…
これもよく見る形ですね。 (define (chapter1-scheme) (define (toplevel) (display (evaluate (read) env.global)) (toplevel) ) (toplevel) )
初期値やデフォルトで使える関数を、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のまとめ。スコープの所が良くわかっていない。(自作処理系の)関数の実装には、(Schemeの)関数を使うのがよい。最も簡単な実装。 (define (invoke fn args) (if (procedure? fn) (fn args) (wrong "Not a funstion" fn))) 練習…
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を読むことにしました。評価機の最初の一歩です。Lispの基本的なルールはこの2つです。 変数はシンボルによって表現される 関数適用は、最初の項が適用する関数を表していて残りがその関数に適用する引数を表しているリストで…
LL/ML Advent Calendar 6日目の記事です。 12/6日には完成していましたが、あなたが今記事を見ようとした瞬間に記事が文字になり、にインターネットにデータが送られました。遅延評価素晴らしいです。 以前twitterにはつぶやいたのですが、大事な話なのでま…
漫画が独特の味を出しているCommon Lispの本、Land of Lispを読みました。とても面白かったので紹介します。 本の内容 ゲームを作りながら、Common Lispや関数型プログラミングについて学べる本です。他の「ゲームで学ぶ・・・」系の本と違うのは、既存のゲ…
Common Lispでも、Windowsのレジストリを操作したいですよね。LispWorksならレジストリも楽々操作できます。 レジストリの読み出し win32:registry-valueを使います。 (win32:registry-value "\Software\\LispWorks\\LispWorks\\5\\1\\Editor" "Input Format…
LispWorksのIDEを使っていると、ちょっとディレクトリ作りたいときや、ちょっとファイルを削除したいときに、diredを期待してC-xdを押してしまいます。あまりにも同じミスを何度もするので、LispWorksからWindowsのファイラーが起動するようにしました。 外…
小黒さんによる「Lispマシンを作ってみた」を見ました。なかなか遠くのイベントに参加できないので、録画で後から見れるようになっていると助かります。関係者の皆さんありがとうございました。動画を見てもらえれば分かりますが、FPGAの上でLispコンパイラ…
Script-Fuを使いましょう。みんな大好きSchemeです。 GIMPでScript-Fuを使うときの問題点 GIMPでScript-Fuを使うには、Script-Fuのソースを特定のフォルダーに置く必要があります。私の環境ですと、この2つのフォルダーがScript-Fuの置き場になります。 C:\h…
Quicklisp を使うをみていたら、初期化ファイルの中でmaximaに関する記述がありました。LispWorksでも動きそうなのでやってみました。環境は64bit Windows7、LispWorks Professional Edition 5.1です。まず、http://sourceforge.net/projects/maxima/files/M…
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マシーンCADRのクロック生成方法が面白かったのでまとめてみました。回路図(CADR_schematic.pdf)の64ページです。図のpdfはこちら。通常のクロックのように、水晶発振子を使わずに、SRラッチと遅延回路の組み合わせでクロックを作っています。クロックが…
LispマシーンCADRのclock distributionを調べてみました。回路図がスキャンしたPDF(CADR_schematic.pdf)しかないので、目で追いかけてみました。苦労した割りにはあまり面白くないですが、途中経過としてまとめてみました。 CADRのクロック分配は、基本的に…
IM-528_CADR.pdfからLispマシーンCADRの命令フォーマットをまとめました。CADRの命令長は48bit+奇パリティで、以下の部分が全命令で共通の仕様になっています。 bit 機能 IR[48] 奇パリティビット IR[47] 未使用 IR[46] 統計用bit(Statistics)。特定エリア…
AIM-528_CADR.pdfからLispマシーンCADRの制御バスの図を抜き出してみました。中央右側にPC(プログラムカウンター)があります。 普通のプロセッサと明らかに違う所は、ビット幅の違う小さなメモリが複数あることです。PCは14bit幅、スタックは19bi幅t、disp…
AIM-528_CADR.pdfから、Lispマシーンの機能ブロック図を抜き出しました。回路図が公開されているのはプロセッサとBus adaptor部分です。図を見るとCADRは2つ外部バスを持っています。 1つ目が16bitのバスで、キーボードやマウスが接続されます。UNIBUS COMP…
AIM-528_CADR.pdfからLispマシーンCADRのデータパス(page24a)を抜き出してみました。単純にうつし間違いもあると思うので、気になる人は原文当たってください。 私から見て特徴的な所は大きく2点です。1つ目がALUへの入力がAバスとMバスの2つに分離されて…
CADRのハードウェアをFPGAに実装した場合、どれくらいの規模になるのかを確かめるためにベンチマークを取って見ました。ダウンロードできるVerilogの回路では、ボード上のメモリがほぼ全てLEに変換されています。外付けのメモリを使う事にし、メモリの記述を…
http://www.unlambda.com/cadrから入手できるVerilogファイル(CADDR Revised CADR Verilog)からcadr.vと関連ファイルのみで論理合成をしてみました。ターゲットはCycloe3です。論理合成でエラーが出るので、iram(part_16kx49ram)のみ外付けメモリを使う前提…