sakae
2021/10/20
- OpenBSDが7.0になったと言うのでgaucheが動くか試してみました。結果、最新の機能は使えないと判明、グスン。それは置いておいて、cseqの問題で詰まってます。何か、調べる方法がありましたら教えてください。gauche on OpenBSD
2021/10/13
- pushの完動、確認しました。ありがとうございます。所で、ScmObj self = Scm_ExecutablePath(); の、selfをgdb上で確認する手段って有りますか? 以前scmに付属してた、.gdbinitに call prin1($1,port) みたいなのが紹介されてて、なかなか便利だったものですから。。
- Shiro(2021/10/12 23:48:22 UTC): gdbから呼ぶのだと,
Scm_Write(Scm_VM()->curout, self, 0)
か、Scm_Printf(Scm_VM()->curout, "%S\n", self)
でいけませんか。
- 前者はportが必要と怒られましたが、後者でいけました。
sakae@deb:~/src/Gauche$ cat .gdbinit
define disp
call Scm_Printf(Scm_VM()->curout, "%S\n", $arg0)
end
こんなのを用意して、.gdbinitをgdb起動時に呼ぶようにセットしておきます。
Breakpoint 1, test_paths_setup (av=0xbffff624) at main.c:474
474 ScmObj self = Scm_ExecutablePath();
(gdb) n
475 if (SCM_STRINGP(self)) {
(gdb) p self
$2 = (ScmObj) 0x243ec0
(gdb) disp self
"/home/sakae/src/Gauche/src/gosh"
とても便利になりました。ありがとうございます。
- Shiro: あ、Scm_Writeは最初がオブジェクトで次がport、逆でした。
2021/10/12
- Shiro(2021/10/12 08:14:32 UTC): ああ、libsrc/srfi-1.scmは更新漏れです。LniuxではScm_ExecutablePath()が文字列を返して最初の分岐に行くから今まで気づかなかった。修正をpushしました。
- cseqのエラーはちょっと謎な挙動です。"cseq (coroutine)" と出るテスト以降にcseqのテストは無いんですよ。ということは最初のcseqのテストがもう一回実行されちゃってることになるんですが、そんな器用なことがなぜ出来るのだ…?
2021/10/09
- headを入れたら、promptが変わっていたので、なんでかなと思ったら、編集機能が入ったんですね。かくなる上は、補完もお願いします。zzz gosh$
- Shiro(2021/10/09 13:33:11 UTC):編集機能はだいぶ前からあったんですが、0.9.10まではデフォルトでoff、環境変数でonだったんです。補完は欲しいですね。なおncursesなどの画面制御ライブラリは使わず、全てSchemeで書いてあります(最小限の端末コントロールシーケンスでやってるので、時々画面がチラつきます)。Windows consoleでも使えます。
2021/10/01
- Shiro: Ubuntu/x64だと7117625.434171771になりました。i386はひょっとするとx87の拡張浮動小数点演算がどっかで入ってずれることはあり得なくはないですが、そちらのDebian/amd64での結果が違うのは気になります。
- sakae: もしかしたら、Debian/amd64をVMWARE Playerで動かしているのが影響してるのかも知れません。生のamd64マシンがあれば、追試験が出来るのですが、当分お預けです(セキュリティを理由にWindows11機を新調し、今のWindows10機を払い下げる?)
- ちょっと気になったので、再確認しました。(Debian|OpenBSD)/amd64 on VMWARE
#include <math.h>
#include <stdio.h>
float resf(float l, float c){
return ( 1.0 / (6.283185307179586 * sqrt(l * c)) );
}
double resfd(double l, double c){
return ( 1.0 / (6.283185307179586 * sqrt(l * c)) );
}
int main(){
printf("%20.10f\n", resf(1e-6, 500e-12));
printf("%20.10f\n", resfd(1e-6, 500e-12));
}
sakae@pen:/tmp$ ./a.out ;; Debian
7117625.5000000000
7117625.4341717707
ob$ ./a.out
7117625.5000000000 ;; OpenBSD
7117625.4341717707
2021/09/28
- Gauche-gl経由でgauche-packageを知った。それで、パッケージの作り方を、見様見真似で実習。ruby-ffiに負けるなって所まで、漕ぎ着けた。あちらは、gemのインストール時に、ローカル指定が出来る。gaucheもカジュアルに、ローカルにインストール出来ると嬉しい。Gauche-package
2020/01/07
- やはり動かないなあ。今朝みたらflushが埋め込まれてて、そのソースを使ってます。
debian:test$ gosh
gosh> (define current-trace-port (open-output-file "LOG.txt"))
current-trace-port
gosh> ,l ./genstub
#?="./genstub":168:(c-name-of cproc)
#?- "stdlib_eqvP"
:
#?="./genstub":168:(c-name-of cproc)
#?- "stdlib_procedure_info"
#t
gosh> (display "HOGEFUGA" current-trace-port)
#<undef>
gosh> (close-port current-trace-port)
#<undef>
gosh> ^D
debian:test$ cat LOG.txt
HOGEFUGAdebian:test$
current-trace-portを指定したにも関わらず、結果がreplに流れちゃうのは何故? goshを抜ける前にダミーデータを書き込んで抜けると、それはちゃんとファイルに落ちてる。
ひょっとしてcurrent-trace-portがstderrに切り替わっていない?
debug-print-preを見ると、current-trace-portが手続き扱い()で括られているけど、どういう意図なんだろう? 私の知らない世界なのかなあ。
バッファリングは気にしてませんでした。普通にpipeしてその先でgrepとかtailしても、満足する結果が得られてましたから。あ、pipeだと即座に流れて行くのか?
- Shiro(2020/01/07 02:20:32 UTC):
current-trace-port
は current-output-port
などと同じパラメータです。下でsakaeさんが書き込んでいるように、(current-trace-port)
と引数なしで呼び出すと現在の値が返り、(current-trace-port <ポート>)
と呼び出すと<ポート>が新しい出力先になります。なので(current-trace-port (open-output-port "log.txt"))
とやっておけば以降の出力はlog.txt
にいきます。
- "2020/01/07 06:58:20 UTC" パラメータの説明を読んで、やっと理解出来ました。そして無事に動きました。どうもありがとうございました。
- chtonについて
出目がチャットなので、RETURNキーでcomitなんですね。明示的に改行したかったらSHIFT+RET しなさいと言う事ですね。そして、SHIFT+RET が混じってる投稿は背景が着色される仕様なんですね。
複数行を手軽に張り付けるには、どうすれば良いのだろうか? 公衆の面前で実験は控えたいな。
- Shiro(2020/01/07 02:20:32 UTC): 手軽に貼り付けるにはエディタなどで書いてcopy&pasteしてもらえれば。なお一回の書き込み中に改行があれば必ず背景色がつきます。改行なしなら色がつきません。
2020/01/06
- check current-trace-port
(base) sakae@debian:tmp$ gosh
gosh> current-trace-port
#<primitive-parameter current-trace-port @0x7f663e84a6c0>
gosh> current-error-port
#<subr (current-error-port :optional newport)>
gosh> (define current-trace-port (open-output-file "LOG.txt"))
current-trace-port
gosh> current-trace-port
#<oport LOG.txt 0x7f663e880c00>
gosh> ,l ./genstub
#?="./genstub":168:(c-name-of cproc)
#?- "stdlib_eqvP"
LOG.txtは空ファイルだった。使い方がまずいのかなあ?
- Shiro(2020/01/06 06:07:13 UTC): 出力ファイルは特に指定しなければバッファされるので
flushするかcloseしないと全部書き込まれないです (これは大抵のプログラミング言語やOSで同じ)。
flushやcloseの手間をかけたくなければ、open-output-fileに
:buffering :none
という引数を渡してください。バッファリングしなくなります(が、遅くなります)。
- Shiro(2020/01/06 08:23:58 UTC): あーでも、ログ用途を考えるとトレーサ側でflush入れる方が便利な気がしてきました。
2020/01/01
2019/12/09
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
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
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
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
2003/02/26
どんな、.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
- ありがとうございます。今度、0.6.3が出たらやってみます。でも、bugが取れているのでしょうね。多分、きっと!
- 早速出たので、skimu流にやってみました。NetBSD,FreeBSD 4-stableでOKを確認。おまけで、FreeBSD 3.5.1-RELEASEとコンダラにも入れました。
- Shiro: あたたたた。実は今、0.6.3の最終テスト中なんですが、
この問題のfixは入っていません。うーんどうしようかな。(2002/09/22 00:51:28 PDT)
- ところで、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
Last modified : 2021/10/19 21:02:55 UTC