サクサク読めて、アプリ限定の機能も多数!
トップへ戻る
Wikipedia
blog.bugyo.tk
以前、g000001さんに教えていただいた、 『LISPマシン・プログラミング技法』 という本を京大の図書館で借りてきました。 (学外の学生でも普通に借りれました。すごく親切。) まだ途中までしか読んでいませんが、なかなか面白いです。 「クリック」に対する説明が書いてあるのが時代を感じます。 それにしても、最後に借りられていたのが92年のようなので、 実に17年ぶりの貸し出しのようです。 なんてもったいない・・・
Common Lispにはdisplaced arrayと呼ばれるものがあります。 これは他の配列へのポインタのようなもので、CLHSでは以下のように定義されています。 displaced array n. an array which has no storage of its own, but which is instead indirected to the storage of another array, called its target, at a specified offset, in such a way that any attempt to access the displaced array implicitly references the target array. (CLHS: Glossary-Section D) 試しに使ってみるとこんな感じです。 C
あけましておめでとうございます。今日から2009年ですね。 ところで、今から10年前の1999年はポケステが発売した年です。 という訳で、ポケステ発売から10年(*1)を記念して、 プログラムの書初めとして、ポケステ用Lispインタプリタを作りました。 (*1) ちなみに、生産は2002年で終了しています。 電池がすぐに切れることで有名になったハードだからそんなもんですかね(笑) 私も2回ほど電池交換をした後に面倒になり、ただのメモリーカードとして使いました。 メモリーカードとしてはいまだに現役ですが、ゲーム機としては使っていません(笑) 残念ながら書き込み装置がないので実機ではなくエミュレータです。 実機で動くかは残念ながら不明です。 画面は小さいですが、256文字までの式を入力可能です。 RAMが非常に小さいため、使用できるセルの数は少ないですが、 GCをちゃんと付け
突然4コママンガになった。 内容はともかく、かなり教育マンガっぽくなった。
最近のCコンパイラは末尾再帰の最適化を行ってくれるそうです。 しかし、Cにはポインタがある以上、上手く最適化できない場合もあるよなー みたいなことを一年ほど前に思いついたんですが、試すのが面倒で放置してました。 それが、今さらになって気になってきたので試してみることにしました。 コンパイラには『gcc (GCC) 4.2.1 20070719 [FreeBSD]』を使用。 まずは、最適化されそうな関数。 int f(int n, int acc) { if (n これを『gcc -c -S -O2』でコンパイルしたところ、以下のようになりました。 f: pushl %ebp movl %esp, %ebp pushl %esi pushl %ebx subl $16, %esp movl 8(%ebp), %ebx movl 12(%ebp), %esi testl %ebx,
まさかの続編。 どのコマから読めばいいのかもはや分からない
以前から、WindowsでCLのプログラムを書く際に、 Meadowの上でSLIMEを動かしたかったんですが、 .emacsにSLIMEの設定を書いただけではエラーが出て困っていました。 が、Windowsの上でCLのプログラムを書く機会がなかったので放置してました。 で、今度大学の後輩にCLを教えることになったんですが、 皆Windowsを使っているので非常に困ったことになりました。 Lispboxを使ってもいいけど、これは日本語が使えないらしい。 で、MeadowでSLIMEを動かす方法をnathkiに調べてもらったらんですが、 解決法は意外と簡単でした。 Cygwinを起動して、以下のコマンドを入力するだけ。 $ cd / $ mkdir c $ touch /c/NOT_MOUNTED $ mount c:\\ /c なんでこれで上手くいくのか良く分からないけど上手
あるとき、emacs上でSLIMEを動かしながらCLのコードを書いてると、 突然HDDアクセスが多発して、ほとんどフリーズに近い状態になりました。 調べてみたら、Lispプロセスが一人でメモリを500MB以上も使っていました。 図1. メモリを食いつくLispプロセス 一度プロセスを殺して再起動したら直りましたが、時々同じ現象に遭遇します。 メモリを512MBしか積んでいない私のPCにはこれはかなり致命的なのですが、 たまにしか起こらないので原因がよく分からず非常に困りました。 分かっているのは、この現象が起こると同時にemacsとSLIMEのコネクションが切れるということだけ。 そういや、CLISPは使用するメモリの量をあらかじめ制限できたような出来なかったような... それができたらどうにかなるかも。...根本的な解決策じゃない気もしますが(笑)
Lispのひび なんかね、13歳でLisp処理系作ってるらしいですよ。 私が13歳の頃はもぐらたたきを作るのが精一杯でしたよ。 それに引き換え、最近の若い人は凄いですね。 私もCで簡易Schemeインタプリタを作ったことがあるので、 返事がもらえるかは分かりませんが、気になったことを適当に書いておきますね。 * リーダはどうやって書いてるんだろう readを追加。数値アトムを読み込むことに成功。 80文字までのバッファでfgetsでstdinから読む。長すぎる場合、sskipが内部でバッファ切り替えなどもやるような仕組みでLispの本と同じ。 (T216の現状) アトム読み込みのとき、isspace(..)の代わりに*.. == ' 'と書いていて間違いだった。改行とかも考慮するんだぁ。 後はリストを上手く読み込むように再帰構造を作るだけ。 (isspace) とのことですが、関
データを入れるところが2つある箱をコンスセルという。 左側の入れ物がCAR(カー)で右側がCDR(クダー)。 どうして左側がCARなのか分かる? 車は左側通行だからさ! --- Lisp初学者が一度は聞くことになる(と私は思い込んでいる)決まり文句です。 しかし、ここで誰もが疑問に思うのが「CDR」の存在です。 CARが左側通行の乗り物ということは、CDRという右側通行の乗り物があるのでしょうか。 しかし、CDRの正体を尋ねてみても、 「そんなCDRらないことを聞くな。」 と、お決まりの返事をされ、結局CDRの正体を教えてくれません。 ひょっとしたら皆が決して触れようとしない、「クダー」という名の乗り物が存在するのではないのか。 そして、真のLisperのみが隠れてクダーに乗っているのではないか。 そう考え、私なりに色々と想像してみました。 「クダー」という独特の響きや、
昨日気づいたんですよ。 Google Map APIを使えばゲームが作れるんじゃないかって。 地図の上で車を走らせたり、飛行機を飛ばすといった、 地図と連携したゲームじゃなくてもっと単純なゲームを。 遊ぶ AIRを知らない人には本当に意味が分からないかと思います。。 そして、AIRを知ってる人も結局は意味が分からないかと思います。 (追記) Google Mapなのが分かりにくかったので、 縮尺を変えて露骨に地図を表示するように変更。
世界中で数人しか知らなさそうですが、 ニコスクリプトは演算子オーバーロードが出来るんですよ! 0::/t=drawText(text:"",size:20,color:0xffffff) 1::/echo=dt 1::/echo.setSlot('lessThan',def_kari('#:g3',t.text+=$1)) 2::/trg=dt 2::/trg.setSlot('divide',def_kari('#:g2',t.text+="365";echo)) 3::/X=dt 3::/X.setSlot('divide',def_kari('#:g1',t.text="ひだまり"+$1;trg)) 4::/_="スケッチ" 5::/X / _ / X 実行すると動画内時間5秒で「ひだまりスケッチ365来週も見てくださいね!」と画面に表示されます。 dtというのは本来画面に文字
Common Lispでは多値を必要としない場面で多値(正確には2個以上の値)が返された場合、 最初の値が使用され、後は捨てられます。 (list 1 (values 2 3)) => (1 2) ここまでは知っていたんですが、同様に多値を必要としない場面で0個の値が返された場合、 nilが使用されることが仕様で決まっていることを知りました。 (list 1 (values 2 3) (values)) => (1 2 nil) なんでもしっかり決まっているのがCommon Lispのいいところですね。 一方、Schemeはどうなっているかというと、 Schemeのvaluesは次のように定義できます。 (define (values . things) (call-with-current-continuation (lambda (cont) (apply cont things
ニコニコ動画のメンテナンスが終わったので、ニコ動Lisp2.0(仮称)が始動しました。 【ニコニコ動画】ニコ動でLisp 「もっと評価されるべき」タグが付いていたので、文字アトムも評価することに。 もっと評価されるべきの意味が違うという突っ込みもありました。 期待通りの突っ込みをありがとうございます。 それはともかくスクリプトを更新して1分もしないうちに 「ラムダきたー」というコメントが書き込まれたんですよ。 どれだけlambdaが欲しかったんだwwww まあ、なにはともあれ、lambdaが無事動いてよかった。 普段から「lambdaかわいいよlambda」とお思いの諸兄も安心してニコニコできますね。 --- prognとかdefunとかLisp的(NOT Scheme的)なスペシャルフォームを持っていますが、 lambdaに関してはScheme的な評価規則となっています
ニコニコ動画で動作するLispインタプリタですが、 ついにlambdaとdefunが完成しました。 もちろん再帰呼び出しも可能です。 (defun f (x) (if (eq x 0) 0 (+ x (f (- x 1))))) (f 3) こんなコードが動きます(ただし、2回に分けて入力してください)。 で、ちゃんとテストもしたし、これで完成だと思い、 確定ボタンを押したんですが、なぜかニコニコ動画から反応が返ってこない。 何回試しても反応が返ってこない。 一旦ログインからやり直してみるかと思い、ログアウトしようとしたら、 メンテナンスのお知らせ 現在ニコニコ動画はメンテナンス中です。 5月28日(水) 13時00分~16時00分(予定) ※都合により変更となる可能性がございます。 ぎゃああああああああああああああああ ちなみに、スクリプトの確定ボタンを押したのは13時を
昨日の動画に書き込まれたコメントを見てみたら、 (+ 1 2) とか (print "hoge") といった書き込みが多数ありました。 pure lispっていったのに…… 特に前者のような数値演算をする式があまりにも多かったので、 急遽、数アトムと+をつくり、ついでにifやprognも作っておきました。 少し気になったので、コメントを ・リスト操作 ・数値演算 ・printを使用 の3つに分類してみたところ、以下のような結果になりました。 (複数に分類されたり、どれにも分類されなかったものもあります。) ・リスト操作: 32% ・数値演算: 47% ・printを使用: 20% ちなみに、この集計を取ったのは、数アトムと+を作った後ですが、 半数のコメントはこの改造前に書かれていたものでした。 ちゃんと評価できた式は50%前後といったところでしょうか。 数値計算
どうもzickです。 2/1に見た夢をきっかけに触り始めたニコスクリプト(正確にはニワン語というらしい?)ですが、 しばらく触っていないうちに色々と機能が追加されており、なんと手続きが作れるようになっていました。 知らない機能を色々触っていたら、いつの間にかLispインタプリタが出来上がっていました。 【ニコニコ動画】ニコ動でLisp 2/1に見た夢が4ヶ月ほどを経て正夢になってしまいました。 関係ありませんが、少し前に単位が足りなくて4年生になれない夢を見ました。 こちらの夢は正夢にならないことを祈るばかりです。 --- *ニワン語メモ* 大体のことはニコニコ動画まとめwikiを見れば分かります。 (Lispインタプリタを半分くらい作ってからここの存在に気づきました。もっと速くググればよかったorz) とりあえず、ここに載っていないような細かい事項を書いておきます。 [1
3/8の出来事 ~おやつの時間頃~ ____ / \ / _ノ ⌒\ 東京についたお / (○) (○) \ 朝の5時から電車に乗り続けて | (__人__) | 既にしんどいお… / ∩ノ ⊃ / ( \ / _ノ | | .\ “ /__| | \ /___ / ~しばらくして~ ____ /⌒ ⌒\ /( ●) (●)\ /::::::⌒(__人__)⌒::::: \ 会場に着いたお!!! | |r┬-| | \ `ー'´ / ___ / \ /ノ \ u. \ なんか控え室とやらに案内されたお… / (●) (●) \ なんだかよく分からないというか、 | (__人__) u.
中学のとき、初めてC言語とやらに触れてみた。 気が付いたら、リリカルLispなんてカオスなものを作っていた。 私がここまでダメになったのはC言語を最初に触れたせいに違いない。 へ __/ | ` ‐ 、 / ハ  ̄ヽ | / / i l! 丶 |/ /∧ ∧ハ i |! i レイV V VVWV1 | }━━ ━━ | i 「私をダメにした責任、とってもらうからね」 ⊂ニ⊃ ⊂ニ⊃| ! | \ 「 ̄ ̄ ̄ ] /| i | | ハ`ー┬―‐< ! レル′ VV / ! ハ レレ r0へ〈 i / ! く }/ / ヽ \__ノ ̄` し、 〉 /: : : : : :i: : :\ / 〈_ _ _ _ _ ヽ_ _人つ ' ; : ; : ;
ニコニコ動画のスクリプト『ニコスクリプト』の話。 試験期間中というのもあって(*)、こういうものを作ってみました。 【ニコニコ動画】三目並べ あと、このスクリプトでの簡単なアクションゲームの作り方も思いついたんですが、 残念ながら現状ではLispインタプリタは作れそうにありません。 個人的なニコスクリプトの未公開命令のまとめ 基本 未公開命令を使う時は行頭にスラッシュをつける。 処理の列はセミコロンで区切る(二つ目以降の命令にスラッシュは不要) 『時間::/命令1;命令2;…;命令n』が基本の形 式はJavaScriptな「気分」で書ける(実際はかなり制約がある) commentTrigger(then:処理の列, timer:SEC) コメントが入力された(正確には画面に表示された)ときに処理を実行する。他人のコメントでも処理が実行される SEC秒の間のみ有効となり
なんか最近(*) Y Combinator(以下『不動点演算子』)の話題が各所であがっていますが、 あれこれ話はあるものの結局のところ、 F(YF) = YF という式を成り立たせるもの――"不動点"という名の通り、YFをFの不動点にするものだと思います。 (ここの説明が分かりやすいかと。) 不動点演算子自身はこれ以上でも以下でもなく、使い道し次第かと。 記号や演算を最小限にしたのがλ計算だって話もあがってますが、 単純にするならもっと単純にできます。 K ≡ λxy.x S ≡ λxyz.(xz)yz この二つを使えば関数抽象(関数の作成)をすることなく、 関数適用(関数の呼び出し)だけで全てを表せます。 例えば、チャーチ数の 0≡λgu.u は ((s ((s (k s)) (k k))) (k k)) と表せますし、 チャーチ数の後者関数 suc≡λxgu.g((x
zickです。 最近、巷(*)ではLisp(Scheme?)を実装するのが流行っているようで。 その流れにのっとって私も変なものをつくってみました。 ***PostScriptで書いたlisp*** ソース 実行結果 名前はまだないのですが、仮にpslispと呼びます。 このpslispはPostScriptで書いたLispインタプリタです。 単に式を評価するだけではなく、その値を図示してくれる優れもの(?)です。 実は去年の4月ごろにほぼ完成していたんですが、 条件分岐などを加え、再帰が使えるようになりました。 ***pslispで書いたlisp*** ソース 実行結果 pslispで動かすためにエスケープ文字を付加し、改行を消しているためカオスなことになってます。 (追記) はてなブックマークにて指摘がありました。 yshl (と)が対応していればエスケープ
----- 読むのがめんどくさい人はこれだけ見て満足するお! (ただし、ニコニコのアカウントが必要だお) by やる夫 ----- ~朝~ ___ / \ /ノ \ u. \ はっ、夢!? / (●) (●) \ 変な夢をみたお… | (__人__) u. | なんか、ニコニコ動画の投稿者スクリプトで \ u.` ⌒´ / Lispインタプリタを作ったとかやる夫がいってたお… ノ \ どうやって作るんだって自分で思ったら、 /´ ヽ 目が覚めたお… | l \ ヽ -一''''''"~~``'ー--、 -一'''''''ー-、. ヽ ____(⌒)(⌒)⌒) ) (⌒_(⌒)⌒)⌒)) ___
____ / \ / _ノ ヽ、_ \ / o゚⌒ ⌒゚o \ もう試験間近だお… | (__人__) | きっと単位沢山落とすお… \ ` ⌒´ / / ̄ ̄\ / _ノ \ | し ( ●)(●) | (__人__) お前、ソフトウエア演習の授業出てないだろ | ` ⌒´ノ 課題はネットで外から出せるようになってるけど、 | し } 先生に直接見せないと未提出扱いらしい ヽ } 早く先生のとこ行ってきたほうがいいぞ ヽ、.,__ __ノ _, 、 -― ''"::l:::::::\ー-..,ノ,、.゙,i 、 /;;;;;;::゙:':、::::::::::::|_:::;、>、_ l|||||゙!:゙、-、_ ____ /::::::::
zickです。 最近、巷(*)ではLisp(Scheme?)を実装するのが流行っているようで。 その流れにのっとって私も変なものをつくってみました。 ***PostScriptで書いたlisp*** ソース 実行結果 名前はまだないのですが、仮にpslispと呼びます。 このpslispはPostScriptで書いたLispインタプリタです。 単に式を評価するだけではなく、その値を図示してくれる優れもの(?)です。 実は去年の4月ごろにほぼ完成していたんですが、 条件分岐などを加え、再帰が使えるようになりました。 ***pslispで書いたlisp*** ソース 実行結果 pslispで動かすためにエスケープ文字を付加し、改行を消しているためカオスなことになってます。 まあ、これだけ見てもなんのことやらといった感じですが、 自分で書いたlispインタプリタの上でさ
zickです。 リリカル☆Lispの内部で動いているLispインタプリタであるNScLisperのソースを公開します。 こちらからどうぞ。 なお、このソースはBSDライセンスとします。 あまり使い道はありませんが、ご自由にお使いください。 今回は、リリカル☆Lisp全体のソースではなく、NScLisperのみのソースですが、 単体で実行できる用意しておきました。 *実行方法* (1)ダウンロードしたソースファイルの名前を"0.txt"に変更。 (2)http://www.nscripter.com/からNScripterをダウンロード (3)nscr.exeを0.txtと同じディレクトリにおいて起動 まあ、ソースは恐ろしく汚いです。 コメントもただの一時的なメモに過ぎず、見てもなんのことかさっぱり分からないと思います。 ブラフマンのつぐみの言葉を借りるなら …他人の可読性は
Web browser (以下、ブラウザ) 上でのちょっとした作業を自動化したいことは時折あると思います。そういった自動化をCommon Lispで出来ないものかと思い、色々と調べながら試してみました。 Selenium テキトーに調べた所、Seleniumというのを使うと簡単にブラウザ上での作業を自動化できるようです。ブラウザを動かしたいマシンでSelenium Standalone Serverとやらを動かして、そこにHTTPリクエストを投げるとそれに応じてブラウザが色々やってくれるとかなんとか。とにかく自分で書く自動化用のプログラムはHTTPリクエストを投げるだけで、難しいところはSeleniumが全部やってくれると。簡単。詳しくは詳しい人に聞いてください。 CL Selenium WebDriver Common Lispで直接HTTPリクエストを投げてもいいのですが面倒なので、便
このページを最初にブックマークしてみませんか?
『blog.bugyo.tk』の新着エントリーを見る
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く