読者です 読者をやめる 読者になる 読者になる

レガシーコード生産ガイド

私に教えられることなら

ClojureでのImmutable Data Structureについてメモ

ClojureのHashMapとVectorのアルゴリズムについて調べていました。 HashMapの方はHAMTというものがベースになっているようです。 HAMTなんとなくわかった、仮想の巨大な配列を作れるから、ハッシュ値にバラつきがあれば終端のテーブルをコピーしてまわる必要…

SchemeでOCaml風if/let

といっても大層な話ではありません。 Early Returnがしたい JavaScript(ES6)書いてる時なんかによく使うのがEarly Returnです。 function foo (bar) { if (barをチェック) { return だめだよ; } let x = baz(bar); if (xをチェック) { return だめだよ; } le…

Scheme(Gauche)で型推論を書いてみる

Hindley-Milnerの型推論アルゴリズムと、型クラスの実装に興味があるのですが、どこから手をつけていいのかさっぱりわかりません。とりあえず簡単に読めるコード無いかな、と探したところJavaScriptでのHM型推論実装を見つけました。 Type Inference in Java…

SchemeでNFA→DFA変換を書いた

(7/17追記 タイトルその他ほとんど間違えてDFA→NFA変換と書いていました NFA→DFA変換ですね) 最近、前々から気になっていたオートマトンについて「はじめて学ぶオートマトンと言語理論」という本で学習しています。読んでいるうちに実際にオートマトンとNFA→…

Lisp-1でlambdaを使ったlet, let*, 関数内関数定義の実装メモ

SchemeみたいなレキシカルスコープのLisp-1処理系を作るときの話です。 lambda(Lexical Closure)とset!を実装できれば、マクロ又は処理系に変形させることでlet, named-let, let*, 関数内関数定義を実装することができます。 let let式は、lambdaの即適用に…

3imp 4.6メモ

前回に続き4.6まで読み終わったのでメモです。 4.6 TAILCALL 末尾呼び出しの最適化を行います。 文章だけだとちょっと分かり辛かったのがShiftするタイミングでした。 例えば次のコードがあるとして (lambda [a b] (f a 123)) (f a 123)を評価する直前のスタ…

3imp 4.4-4.5メモ

3imp 4.1-4.4メモ - レガシーコード生産ガイドでDisplayClosureまで流し読みして、なんとなくわかったので4章を最初から実装していました。 コード置き場 毎日20〜30分ずつやってたら1ヶ月近く経っちゃった。まあいいや。 3impに関する日本語の記事はそこそ…

3imp 4.1-4.4メモ

まず流し読みしてたけど、現時点でもわかったことが多いのでメモしておく。しかし、英語が……英語が…… スタックベースモデルでは、フレームの内容は全て線形にスタックへ積んでいく。 dynamic link はcallerフレームへの、static linkはlexicalフレームへのポ…

3imp 3章 The Heap-Based Model読んだ

現在、AmeLispのVMはお気楽 Scheme プログラミング入門とLispKit Lisp - Qiitaを参考にしてSECDマシンで作っている。 Scheme、アセンブリ、C、で書いてそろそろSECDマシン飽きてきたのと、いろいろなVMの実装を知って選択肢を広げておきたい、ということでま…

S式→JSトランスレータをGLSLにも対応させた

紹介ではなく振り返り用のメモ。 なにした Scheme(Gauche)でS式→JSトランスレータ書いた - レガシーコード生産ガイド時点でJavaScript専用だったS式からのトランスレータjasjを、マクロを使えるようにして、GLSLにも少しだけ対応させた。 コード(GLSLは下の…

Scheme(Gauche)でS式→JSトランスレータ書いた

github.com S式でJavaScript(とGLSL)を書きたいという欲求が前々からあって、なんか難しそうだから勉強してからだな……と思ってたんだけど、「あっこれ一生とりかからないパターンだ」と昨日の夜中突然思い立ったので、浅い知識でも書き始めることにした。そ…

Schemeで限定継続を使ってClojureのcore.asyncみたいなことをする

(Biwa)Schemeで限定継続を使って非同期処理を書こうとした日記 - レガシーコード生産ガイドでClojureのasyncも似たカンジなのかな、などと言ってたけど、気になって検索して次の文書を見ると全く似てなかった。 Clojure - core.asyncでメインループを手に入…

(Biwa)Schemeで限定継続を使って非同期処理を書こうとした日記

以下全部あやふやな知識に基づいているので凄い人などが気まぐれにパーペキでわかりやすいの書いてくれるのを望む。 Schemeやっぱり面白いな〜といじってて、そういえばSmalltalk調べてたときに、Schemeの継続はアクター理論?のアクタへのメッセージパッシ…

Schemeでクロージャのみでリストを作る

昨日のようなコードをSchemeで書いてみた。 コード JavaScriptだと関数が返す関数に値を適用して、その結果返ってくる関数に……というコードは次のように書けるんだけど f(g)(1)(2)(3)(h); Schemeだと次のようにちょっと書きづらくなる。 (((((f g) 1) 2) 3) …

Scheme(Gauche)で音名の列

最近また(9182391回目ぐらい)、ギターでいい加減そろそろ即興でソロ弾けるようになりたいんじゃ、と少しずつ練習してる。 ソロを一度作って弾いてパターンを指に覚えさせたりしてるんだけど、その前に未だに4〜2弦のフレットがあやふやなので、ランダムに12…

Scheme(Gauche)でSmalltalkライクな簡易OOPをしてみる

Smalltalk(Pharo)でLispを書いてみる - レガシーコード生産ガイド でメッセージング面白いな〜と思ったのでScheme(Gauche)で書いてみた。 (※追記 継承とかバグだらけだった。。) なんかコード記法がおかしくなるのでgithubにpushした phaendal/scm-messaging…