sakae
2012/07/02
- 今日付けのSimpleを試そうと思ったら、function.cの中で使ってる itoa が、unixには無いみたい。(どうもMS由来の様)、しょうがないので、sprintfで急場しのぎ。
- ネット上から、itoa の互換を見つけてきて使ってみた。この関数を使ご利益って何だろう?
char *itoa(int value, char buff[], int radix) { static const char table[] = "0123456789abcdefghijklmnopqrstuvwxyz"; char *head = buff; char *tail = buff; char temp; if (value < 0) { *tail++ = '-'; value = -value; } if (value == 0) { *tail++ = '0'; } else for (head = tail; value != 0; value /= radix) { *tail++ = table[value % radix]; } *tail = '\0'; for (tail--; head < tail; head++, tail--) { temp = *head; *head = *tail; *tail = temp; } return buff; }これを拡張して、Base64のデコーダーにするのかな?それとも、Bignum対応への布石?
2012/07/01
- sasagawa:Simpleさんが鋭意開発されているSimpleを、Unixにプチ移植してみた。
http://space.geocities.jp/hamesspam/
- sasagawa: お久しぶりです。楽しく、かつ、興味深く拝見しました。改良のためのヒントもいただきました。
- 齊藤: 興味深い記事です。 gdb の実用的な使い方の例としても役立ちそうです。 さて、 assq に原因がありそうとのことでコードを眺めてみたところ再帰自体の問題ではなく、 else 節のコードに return が付いてないために返り値が未定義 (でたらめな値が入っている) になってしまっているだけじゃないかと思います。 最適化の有無で結果が変わるのはたまたまだと思います。 同条件で return だけ付けて試してみるとどうでしょうか。 (2012/07/01 11:14:57 UTC)
int assq(int obj, int lis){ if(nullp(lis)) return(BOOLF); else if(eqp(obj, caar(lis))) return(car(lis)); else assq(obj,cdr(lis)); ←ここに return がない!! } - sakae: sasagawaさん、お久しぶりです。齋藤さん、ご指摘ありがとうございました。returnを追加して試した所、gcc,clang共、正常動作しました。gdbで追っても、期待通りの動きとなりました。(2012/07/02 01:44:29 UTC)
- 齊藤: C の規格から根拠となる文言を探してみました。 JISX3010:2003 (いわゆる C99 に相当) の 6.9.1 に「関数を終了させる } に到達し、かつ関数呼出しの値を呼出し元が使う場合、その動作は未定義とする。」とあります。 else 節を実行した後に return で値を返さずに } に到達してしまうため未定義動作となるのでしょう。 最適化を有効にすると期待通りに動くように見えるのは、末尾呼出しがジャンプに置換えられることによって if が真だったときに return で最初の呼出し元まで一気に戻ることになるので結果的に未定義動作の部分を経由しなくなっているからではないかと推測します。 (2012/07/02 09:32:22 UTC)
2002/08/17
- SICP の読破を目指す sakae です。 http://www.ksky.ne.jp/~sakae/
2003/06/01
- make-vectorの初期値は不定? vector
- Shiro: 不定ということなので、R5RS的には#fが入っていようが0が
入っていようが鳩が入っていようがオッケーなんですが、
うっかりそのデフォルト値をあてにしたプログラムを書かないように、
#<unbound>という値を入れています。本当は何かを評価して#<unbound>が
出てきたらエラーにするのがいいんでしょうが、そのへんは手抜きということで…
VM中では、変数の評価値が#<unbound>になるかどうかだけチェックしています。
- Chezでは、初期値が 0 でした。#<unbound>の方が安全ですね。
- なお、(vector 1 2 3)というような式や、ベクタのバッククオートの評価
`#(,x ,y ,z)のような式では、コンパイラがVM_VECという専用のインストラクションを
生成して、それがVMのrun_loop中でScm_MakeVectorを呼んでいます。
- TPO的には、stdlib_XX は、対話セッションで使われ、バッチモードでは、コンパイルされたコードがVMな機械で実行されるという大雑把な流れになるのでしょうか。やっぱり、hacking Guideが欲しいです。
- いえ、対話モードでも、入力された式は常にコンパイルされて VMで実行されます。
- Gauche Hacking Guideというサイトを作りました。--nobsun
- Shiro: 不定ということなので、R5RS的には#fが入っていようが0が
入っていようが鳩が入っていようがオッケーなんですが、
うっかりそのデフォルト値をあてにしたプログラムを書かないように、
#<unbound>という値を入れています。本当は何かを評価して#<unbound>が
出てきたらエラーにするのがいいんでしょうが、そのへんは手抜きということで…
VM中では、変数の評価値が#<unbound>になるかどうかだけチェックしています。
2003/05/25
- list->vectorって重い処理なのだろうか? CSV
2003/05/17
- 処理系毎に違う、関数の引数の順番違いを吸収する便利な方法は?YAML vs ...
- Shiro: 長期的には、srfiに期待。 とりあえずは、マイlibraryでラッパーを書くしかないのでは。
2003/04/27
(define x '(1 2 3 4 5)) (define y '(10 20 30 40 50)) (define z '(100 200 300 400 500)) (map + x y z) (map list x y z) 同じ事をrubyやperlでは、どう書くのだろう? なんて言う疑問は置いておいて、 mapに限らず、引数の数には制限は無いのだろうか? 数個までは効率よく扱ってくれるけど、それ以上は効率が落ちるとか。
- Shiro: 実装依存です。
- 引数をヒープに準備する処理系なら、たぶんメモリの許す限りOK。
- 引数をスタックに積む処理系なら、スタックサイズが限界。 Gaucheもこれで、デフォルトでは10000個弱。 (本来はそれを越えたらヒープに積むようなフォローが必要だと思うが、 Gaucheではエラーになる)。
- 最初の数個の引数をマシンレジスタ渡しにする処理系なら、引数がレジスタに 乗り切らなくなったところで効率が落ちると思われる。
- それから、可変長引数を取る手続きは、コモンケースに関して最適化 してある場合があります。Gaucheでは、引数リストが1つだけのmapやfor-each、 2引数の数値加減算や比較、等です。
2003/04/19
- プロファイラーが欲しいなと書いてみるテスト
- 私も欲しいなと思っていたので作ってみました。->koguro
2003/04/13
- string-set! がcopyしたあれを要求するのは何故だろう。はてながあったよ
- Shiro: copyは本質ではなく、 「プログラム中のリテラル文字列はimmutableである」というのが理由です。 R5RSの4.1.2節と3.4節参照。だからホントは次の式もエラーにしなくちゃ ならないんですが、Gaucheではサボってます。
(set-car! '(a b) 'c)
- リテラル定数がimmutableであった方が良い理由のひとつは、 次のセッションを見て想像してみて下さい。
gosh> (define (foo x)
(let ((clist '(a b)))
(set-car! clist x)
clist))
foo
gosh> (define n (foo 3))
n
gosh> n
(3 b)
gosh> (define m (foo 5))
m
gosh> m
(5 b)
gosh> n
(5 b)
- プログラムの字面と実環境が一致しなくなってしまう -> Bugの温床。どうしてもやりたかったら、ちゃんと複製した上でやれって事ですね。
- やや、ScmString に、s->immutable なんて Flagがあるんですね。対する、Cons cellには同様なFlagが無いような... Gaucheの256倍本が欲しくなります。
→ Gauche:ImmutableObjectへ移ります。
2003/04/06
- (arity if) とかして *** ERROR: cannot get arity of #<syntax if> となるのは特殊形式。うろ覚えだった時に便利かな? でも逸脱した使い方。
2003/03/08
2003/03/02
- なぜ Allegro CL 言うか疑問氷解。Piccolo なのも欲しいぞと。uudecode
- Shiro: 実はgaucheの前に書いていたSchemeインタプリタ/コンパイラを
piccoloと名付けていました。
デザインが古かったので一旦全部捨てて書き直したのがgaucheです。
- そのうちに、フォルテとかフォルテシモが登場しますP
- Shiro: 実はgaucheの前に書いていたSchemeインタプリタ/コンパイラを
piccoloと名付けていました。
デザインが古かったので一旦全部捨てて書き直したのがgaucheです。
2003/02/26
- SICP読書会II期目 15名出席でした。更新をサボっていた自ページも久しぶりに更新 http://www.ksky.ne.jp/~sakae/sicp/ いんちき MH
- 今回から latestがTOPに来るようにします。
- SICP 読書会というのをやっていますご興味がありましたら、覗いてください。 http://www.sampou.org/scheme/sicp/mailingList/ --nobsun(2002/08/18 21:24:20 PDT)
どんな、.emacs 使ってますか?
(setq scheme-program-name "gosh")
(defun match-paren (arg)
"Go to the other matching parenthesis."
(interactive "p")
(cond ((looking-at "\\s\(") (forward-list 1)(backward-char 1))
((looking-at "\\s\)") (forward-char 1)(backward-list 1))))
(global-set-key "\M-p" 'match-paren)
(if (fboundp 'global-font-lock-mode) (global-font-lock-mode t))
(if (fboundp 'show-paren-mode) (show-paren-mode 1))
(setq show-paren-style 'mixed)
まだ、viの癖が抜けなくて、時々 M-x vi-mode しちゃったり、vi で、:set list
して使ったりしてます。()に慣れるのはいつだろう? (2002/07/31 07:40:49 PDT)
(defun set-buffer-process-coding-system-to-eucjp () (set-buffer-process-coding-system 'euc-jp 'euc-jp)) (add-hook 'inferior-scheme-mode-hook 'set-buffer-process-coding-system-to-eucjp) (put 'receive 'scheme-indent-function 2)
祝 GaucheがFreeBSDのportsになったぞ !
/usr/ports/lang/gauche と /usr/ports/database/gauche-gdbm
lang が defaultで utf-8 と言うのは時代の流れ? (2002/09/10 03:26:51 PDT)
ヒアドキュメントが欲しいなぁ
(use gauche.process)
(define plot-command " set terminal png color set grid set ylabel \"Output \" set yrange [0:20] set xlabel \"Date\" set xdata time set timefmt \"%Y%m%d%H%M%S\" plot \"data.txt\" usi 2:1 ti \"output\" with impulses ")
(display plot-command (open-output-process-port "gnuplot > out.png" ))
こんな事をやろうとすると、本格的(?)なヒアドキュメントが欲しくなります。(2002/09/11 04:04:36 PDT)
- ChickenとScshは #<< という構文でヒアドキュメントが書けますね。 ヒアドキュメント、追加するのは難しくないのですが、それを許すと プログラムのメタ解析がひどくやりにくくなりそうなので保留にしてます。 (例えば、readを使わず自前のルーチンで括弧の対応を見付けるとか)。 readをもうすこし高機能化するか、汎用のスキャナを作ってこのへんの 構文解析の基本ツールを整えたらやってみてもいいかもしれません。Shiro (2002/09/11 12:16:59 PDT)
NetBSD 1.6-RELEASE でも、Gauche !
pthreads を除き make test がOKとなりました。wilikiも動作します。http://www.ksky.ne.jp/~sakae/sicp/wiliki.html (2002/09/21 05:18:23 PDT)
- charconv でエラーが出るのは多分 configure.in のバグです。(/usr/pkg に iconv ありません?) --with-iconv=/usr/pkg をつけると -liconv が LIBS に追加されてうまく行くと思います。現状は --with-iconv が無くてもヘッダを見つけてしまい、 コンパイルは iconv があるのを前提に行われますが、リンクは iconv が無いものと思って(LIBSに-liconv がないまま)行われてしまいます。skimu
- ところで、NetBSD 1.6 の Web サーバーは何をお使いですか?
実は今日 wiliki.el のデバッグのため apache を pkg_add しようとしたのですが、
なんかバージョンが沢山あって、どれをインストールすればいいのか分からなかったので、、アドバイス下さいませんか? セキュリティのうるさく無い LAN 内だけで
動かすのが前提で wiliki.cgi さえ動けばいいのでなるべく設定がやさしいのが
うれしいです。skimu
- apache だけは、自前でコンパイルしています。(OSによって、皆それぞれのdirを置く場所が異なるため、いろいろなOSで遊ぶ私には、負担) ./configure --prefix=/hoge/www で、統一してます。こうしておけば、/hoge/wwwの下に全部まとまります。ただ動かすだけなら、httpd.confの中のportの確認と、サーバーネームのコメントを外す。後は自分のページに書いた注意ぐらいでしょうか。
- ありがとうございます。無事お家の NetBSD で WiLiKi が動くようになりました。 skimu
- Shiro: ところでこのWiLiKiの更新時刻表示がPDT(PST)になるのは、 レンタルサーバーに西海岸の会社を使っているからです。wiliki.scm内では 何も考えずにlocaltimeしているのでこうなります。 wiliki.cgi内でカスタマイズできるようにしても良いんですが、 ここを見ている人はJST、HST、CSTあたりに散っているようなので、 どこに固定しても同じかなと。もしクッキーを使ったユーザプレファレンス みたいのを入れるなら、ユーザ毎にタイムゾーンを設定できるようにしても 良いかも知れません。(2002/09/22 04:21:21 PDT)
OpenBSD-3.1/sparc版で、コンパイル失敗
とほほな事だけど... http://www.ksky.ne.jp/~sakae/sicp/ob31.html
- Shiro: むむ。アセンブラでこけてますね。 インラインアセンブリのどこかが変なのかな。エラーが起きた.sファイルの 該当行周辺はどうなっているでしょう? あと、configureスクリプトが同じチェックを繰り返す件ですが、 昔のconfigureはデフォルトでキャッシュファイルを作って重複チェックを避けて いたと思うんで、autoconfの時のオプションで何かできるのかもしれません。 (ただ、うっかり古いキャッシュファイルが残っていてはまる、 ということもしばしばありましたが)。(2002/10/04 20:51:37 PDT)
NetBSD-1.6/sparc版でも、コンパイル失敗
またもやとほほな事だけど ... http://www.ksky.ne.jp/~sakae/sicp/nb16.html
FreeBSD/sparc版でも、コンパイル失敗
笑ってやってくさい。 ... http://www.ksky.ne.jp/~sakae/sicp/fb5.html
- Shiro: か、kernel panicですか??? うーむ。皆目見当付きませんです。 ただ、Boehm GCのはかなり低レベルなところをいじっているので、 ソースを持って行ってすぐ動くというものではなさそうです。 gc/doc/READMEなんちゃら 中に「動く」と書いていないプラットフォームで 動かすのは結構きついと思います。
Vine 2.1.5/sparc版で Gauche 0.6.4 が完動しました。
やっと動いたぞって感じです。http://www.ksky.ne.jp/~sakae/sicp/Vine.html
Shiro さん、おめでとうございます。
これから、忙しくなりますね。 http://www.ipa.go.jp/NBP/14nendo/14mito/gaiyou/6-1.html 近山PMさんは、ひょっとして、和田先生と Utilispをやられた方? 先生に聞いてみれば良かったか。
- たしか、68系のシステム上の実装は近山さんだったと思います。バリバリの言語処理系屋ハッカーということをうかがったことがあります。--nobsun
- 68Kですか。懐かしい。A0 が cons を指しているとすれば、car を取るのが、move.l (A0) D0 で、cdr は、move.l 4(A0) D0 。68000だと、アドレスラインが24本しか無かったので、これ幸いとばかり最上位バイトをtagに使えましたね。思い出してしまいました。
Shiro: ども。開発期間も折り返し点を過ぎ、ぼちぼち追い込みにかかっています。 (2002/11/10 23:03:33 PST)
- このプロジェクトでは,言語は何を選定されたのですか? ここはやはりScheme? todo 2002/11/11 07:08:29 PST
- 戯: 近年はUML描きやCADにも遠隔協業(^^;の仕掛が取り入れられてるようですが、あーゆー感じでしょか? 2002/11/15 01:14:33 PST
- そういや(昔遊びで)DTMやってて、データFileをやり取りするだけなのが不満でした。 2002/11/15 01:14:33 PST
- Shiro: Gauche使ってます>todo。CAD系でいくつか見たものは、 リアルタイムでの情報の共有に重点が置かれているような印象を受けましたが、 自分としては完全に共有された空間をいじるのではなく、手元にあるのは あくまでプライベートコピーで、自分の担当部分だけをチェックインする、 というスタイルをサポートしたいと思っています>戯。遊べるものが出来たら お知らせします。
- 戯: CheckInモデルですか。仕事で数年来、分散環境でCheckInモデルでObjectを弄るシステム (子ClassとしてCADファイルClassを作る/使う事も多い)を作って/使っていますが、 近年はそのシステムが「進化」した結果としてリアルタイムモデルに移行する(のを欲してる(誰が?))感じのようで。 これは今時の人にはCheckInモデルじゃ食い足りないという意味なのか、それとも単にBloadBandとかの需要を煽ってるだけ(笑)なのか…
- Shiro: 作る「モノ」によるんじゃないでしょうか。CG系では、自分の担当部分は 自分が納得するまでローカルで作り込みたいという指向が強いように感じます。 ブランチが自由に作れて、各ブランチの中でリアルタイムにDBがアップデートされる、 でも良いのかもしれませんが…
FreeBSD-current/i386
- enable pthreads http://www.ksky.ne.jp/~sakae/sicp/bye2002.html