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

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

私に教えられることなら

Common Lispの最適化に挑戦してみる

今まで最適化についてよくわかってなかったんだけど、自作Forthのベンチマーク計測といっしょに挑戦してみることにした。処理系はSBCL。 同じように最適化についてまったくわからない人のために理解の軌跡をメモしておく。 まず他の言語の計測結果を再掲する…

Lispbuilder-SDLのサンプルを改造してみる

なんとなく触ってなかったLispbuilder-SDLを触ってみることにした。 Linux MintとSBCLで、(ql:quickload :lispbuilder-sdl)ですんなり入った。前に使ったっけ?GUIライブラリ調べたときにcffiとかのライブラリ揃ったのかな? インストールやサンプルの実行は…

PAIPメモ 4

PAIP(実用Common Lisp)を読んでて気になって調べた事などをメモします。 エクステント レキシカル変数はレキシカルスコープと無限エクステント、 スペシャル変数は無限スコープと動的エクステントを持ちます。 他の組み合わせはあるのかというと、nilなどの…

PAIPメモ 3

PAIP(実用Common Lisp)を読んでて気になって調べた事などをメモします。 今回はch3.13「デバッグツール」から。 step SBCLと、SBCLをSLIMEから使ったところ上手くステップ実行できませんでしたが、 CLISPだとPAIPで説明されているようなステップで実行できま…

CommonLispコード読みメモ 1

他人が書いた(大きい)コードを読めるようになりたい CommonLispに詳しくなりたい ということで、まずはメンテナ不足らしい?CLISPのコードを読むことにしました。 勉強のために他人のコードを読むこと、が殆ど無かったので、コードを読む事自体の練習です。 …

PAIPメモ 2

PAIP(実用Common Lisp)を読んでて気になって調べた事などをメモします。 今回はch3.11から。Common Lispの概要です。 多次元配列 1次元の場合 CL-USER> #1A(1 2 3) #(1 2 3) 又は CL-USER> #(1 2 3) #(1 2 3) 2次元の場合 CL-USER> #2A((1 2 3) (4 5 6)) #2A…

PAIPメモ 1

PAIPでCommon Lispの勉強中に気になったことのメモ。 do ループ関係をよく知らなかったので詳しく見てみます。 リストの長さをdoを使って調べるlength-doを書いてみます。 (defun length-do (xs) (do ((i 0 (1+ i)) (xs xs (cdr xs))) ((null xs) i))) xsの…

Common LispとClojureでパーサコンビネータを作る

HaskellのParsecがすごいらしい、ということは聞いていたんですが、JavaScriptでパーサコンビネータのコンセプトを理解する(「正規表現だけに頼ってはいけない」の続き) - id:anatooのブログという記事のおかげでようやく使い方と作り方がわかったので、作っ…

ConcatenativeなFactor(Forth)ライク言語を作るのに挑戦しました

Forth + プロトタイプベースなFactor風言語を作りました - レガシーコード生産ガイドの記事のあと、様々なバグを発見して修正しているうちに、「これはよりプリミティブなものを作って基礎をしっかりさせたほうがいいのでは」と思い、純粋にクォーテーション…

遅延評価(遅延シーケンス)利点の1つに気づいたのでCommon Lispで確かめる

Clojureでローグライク書いてるんだけど、そのために遅延シーケンスとイミュータブルなデータ構造を多用したことで、今まで気づいてなかった遅延評価(シーケンス)の利点がわかったのでメモしておく。 正格評価や遅延評価など、用語の使い方に間違いがあれば…

SBCL / Linux Mint でGUI (Ltk, cells-gtk)

なんとなく、HTML5ばっかじゃなくてネイティブのGUI触る方法も知っておこうかなと思ったので調べてみた。 方針 日本語の表示と入力を試す fcitxとMozcを使う。IME周りよくわからないので問題おきたらそこで断念する(と思う) quicklispで簡単に使えないものも…

少しだけClojure

目が覚めてしまったのでプログラミングClojure第2版を読みながら少しだけ触ったメモを書いておく。 ソースコードのダウンロード 公式のダウンロードページから落としたものはREADMEとproject.cljが入ってない。(RAKE?ファイルでどうにかするのかな) なのでgi…

CommonLispで簡単に自作ライブラリをロードしたい

require、asdf、quicklispなど選択肢も解説もやり方も多数見つかってよくわからないCommon Lispのモジュール関係。 やりたいのは次のような構成で app.lisp watch.sh library/ module-a/ module-b/ watch.shでファイル変更を監視して、sbcl --scriptか何かで…

Parenscriptで別ファイルでPSマクロを定義する

ずっとできなくて悩んでたんだけどGithubでコード見て回ったらわかった。最初から見れば良かった…他人のコード読むの大事だ。 psマクロ内でdefmacroして、それをどうにかして別ファイルから使おうと悪戦苦闘していたけど、psマクロ外でdefpsmacroを使えばい…

expect-returnsに無引数でのテスト記法追加

phaendal/expect-returns phaendal/expect-returns · GitHub 昨日作ったexpect-returnsに、引数無しでのテストを追加した。しかし状態によって変化したり、副作用があるテストはもっと別の形式で明示的に書くようにしたほうが良さそうなので消すかもしれない…

Common Lispでexpect-returns

ウルトラめんどくさがりニンゲンなのでとにかくコードをタイプしたくない。書きたいけどタイプはしたくない。繰り返しがいやなんじゃ。 というわがままを叶えるためにLispを使っているので、テスト書きでもその欲求を満たすべくいろいろ模索している。今のと…

ParenscriptとCommonLispで関数の部分適用

JavaScript Ninjaの例を複数引数に対応するようにちょっと拡張して、Parenscriptで作ってみる。argumentsは配列のインスタンスではないので、Array.prototype.slice.callで変換してやらないと使えない。それからParenscriptでchain-caseがcamelCaseに変換さ…

Common Lispでコンピュテーションをアンダースタンディングする 2

変数、何もしない文、代入文まで。 前回

Common Lispでコンピュテーションをアンダースタンディングする

アンダースタンディング・コンピュテーションを読み始めた。サンプルコードはRubyで書かれているけど、Common Lispの練習をしたいのでCommon Lispで書いてみる。 また、ボトムアップ設計の練習として、簡単なリストを使った構造から始める。 それで対応でき…

CommonLispのバッククォートとカンマの入れ子が多分わかった

Common Lispでのバッククォートの入れ子の謎 - レガシーコード生産ガイド に対して、 Gauche作者のShiroさんから、以下のわかりやすい記事で反応があったことに気づいた。 http://blog.practical-scheme.net/shiro/20150123-nested-backquote 引用させていた…

ParenscriptからReact.jsを触ってみる

初めてReact.jsを触ってみた記録。LISPでJavaScriptを書くのだ、と決意が固まってきたので、いきなりParenscriptで書き始める。

継続できた…?

「後回しにする」とか言っておいて、諦めが悪いのでずっと考えたり実用CommonLisp見てたら次のことに気づいた。 継続今度こそできた、かな。全て継続渡しにして、call/cc時点での継続をc1とすると、「それが呼ばれた時点での継続c2を無視し、c1で引数を評価…

Lisp処理系制作途中

phaendal/a-piece-of-lisp 処理系のコアは段々出来てきてて、builtin.lでマクロを使ってletやcond、delay/forceにtakeなんかを書いてた。めちゃくちゃ楽しい。 テスト駆動で書いてるからストレスあんまり無く進んで楽しかった。 あとはプリミティブ手続きと…

Common Lispでのバッククォートの入れ子の謎

M.Hiroi's Home Page / Common Lisp 入門:番外編 を見ながら、 phaendal/a-piece-of-lisp · GitHub でLisp処理系を作っていってるんだけど、Common Lispでのバッククォートの入れ子の処理が大分謎だったのでわかった部分だけ書いておく 最初に謎だったのは…

Parenscriptのマクロでハマった

ライフゲームを作った時にできたマクロや関数を別ファイルに移して使おうとしたんだけど、動かない。調べてみるとマクロが展開できてないみたいだ。 (eval-when (:compile-toplevel :load-toplevel :execute) (defvar *game-code*) (setq *game-code* ())) (…

Common LispでScheme処理系作成に挑戦

phaendal/a-piece-of-lisp phaendal/a-piece-of-lisp · GitHub C-c C-cやC-c C-k連発しながら作ったので、まだ普通には(sbcl --loadじゃ)動かない。定義を並べ替えたりテストを移したりしなければ。 とりあえずテストでレキシカルスコープ・クロージャ・再帰…

Parenscriptでライフゲーム SVG編

SVGでイイカンジの見た目を目指した http://phaendal.github.io/lifegame-parenscript/ リポジトリはここ phaendal/lifegame-parenscript Parenscriptで作ってみた現在の感想 Parenscriptに限らないけど、マクロで書きたくなっても、まず関数や関数渡しで書…

Parenscriptでライフゲーム

Clean Coderを読んで、型みたいな練習、いいな〜と思ったので、Parenscriptでゲームを作る足場を作るのも兼ねてライフゲームを作った。 phaendal/lifegame-parenscript 次はSVGで見た目をいいカンジにしたい。 動くのはここ http://phaendal.github.io/lifeg…

JavaScript、CommonLisp、Parenscriptでの引数確認

JavaScript JavaScriptで引数が渡されているか確認するときは、暗黙の型変換に気をつけなければいけない。 function needX (x) { if (!x) { console.error("error!"); return; } console.log("x is " + x); } // 渡したと判定されて欲しい needX(""); // => …

CommonLispのletとlet*とoptional

一応メモしておく (defvar x 2) ;; letを使った場合は、初期値中の変数は外側を参照する (defun y-let () (let ((x 1) (y (+ x 1))) y)) (y-let) ;; => 3 ;; let*の場合はそれより前で定義された同スコープの変数から (defun y-let* () (let* ((x 1) (y (+ x…

Parenscriptメモ

&key &keyを使ったコードは、引数が次のように変換される var _js48 = arguments.length; for (var n47 = 1; n47 < _js48; n47 += 2) { switch (arguments[n47]) { case 'parent': parent = arguments[n47 + 1]; break; case 'child': child = arguments[n47…

Parenscriptでゲームを作ってみる準備をしてみる

Quicklispのインストール 公式の手順に従う。 curl -O http://beta.quicklisp.org/quicklisp.lisp # 公開鍵が無いってエラーが出た。面倒なので飛ばす # curl -O http://beta.quicklisp.org/quicklisp.lisp.asc # gpg --verify quicklisp.lisp.asc sbcl --lo…

続 Common Lispで遊ぶためにexpectを作って遊ぶ

Common Lispで遊ぶ為にテストフレームワークを作って遊ぶ - レガシーコード生産ガイド これの続きを作って、githubにアップしてみた。 phaendal/expect.lisp (load "expect.lisp") (defun last-elm (x) (cond ((null x) nil) ((atom x) x) ((null (cdr x)) (…

Common Lispで遊ぶ為にテストフレームワークを作って遊ぶ

JavaScript Ninjaを読んでて感動したのが、最初に簡単なテストフレームワークを書いて、それでテストを書きながら学んでいくという本の構成だった。あれほどわかりやすいやり方は他に知らない。 それまでプログラミングの本を読むとき、気分が向いたらコード…

Common Lispで関数合成

年末に注文した「初めての人のためのLISP」が元旦に届いたので読み進めている。 PharoやHaskellが一段落するまで我慢しようと思っていたのだけど、チラッと目を通したらそのまま読みハマってしまった。 いつもどおり、書いてあることを打ち込んでいるうちに…