Lisp Scheme Part41 (855レス)
上下前次1-新
559: はちみつ餃子 ◆8X2XSCHEME 2023/01/10(火)13:31 ID:TxpPtfKm(1) AAS
>>557
スクリプト言語 (処理系) 的な想定だと実行開始時にテキストの解釈から毎回やるので
静的解析もランタイムの一部みたいな感じになる。
この場合に限って言えばどちらにせよ名前のルックアップはやるのだからそのときにわかるだろうとは思うけど
静的解析を頑張らないという方針はあり得るんじゃないの。
560(2): はちみつ餃子 ◆8X2XSCHEME 2023/01/11(水)00:38 ID:s0T2WgwN(1/2) AAS
Gauche で検出されないエラーで (let ((0 1)) 0) みたいなのがあって、
実際にはオプティマイザが消去してしまうんだそうな。
文法の解析で通したものをオプティマイザがエラーとして弾くのも変な話だし、
オプティマイザが走査することがわかっているものを前段階でもチェックするのは二度手間だし、
オプティマイザを密結合してしまうのも保守しづらいし……
という葛藤があるのはわかる。
まあそれぞれに事情があるので原理的に可能だからといってそうすべきだとも言えない気がする。
561: 2023/01/11(水)00:49 ID:LBEzL6fs(1) AAS
0はシンボルじゃないから、文法解析を通しちゃ駄目だろw
562: 2023/01/11(水)01:29 ID:/IOcm4EW(1/8) AAS
そういう手では絶対書かないだろう変なコードも、マクロ書いてるとまれによく発生するから困る
563: 2023/01/11(水)01:59 ID:/IOcm4EW(2/8) AAS
カウンタ変数を捕捉更新しようとして、うっかり評価してしまったケースとか
564: 2023/01/11(水)02:21 ID:z40MB/0w(1) AAS
多分(let ((i (+ i 1))) i)が化けたのかな
565(2): 2023/01/11(水)02:34 ID:LWIYKuEk(1) AAS
letの時点でオプティマイザに通してんのかな
let系はlambdaまで落として((lambda(i) i) (+ i 1))とすれば間違えようがないと思うのだが
566: 2023/01/11(水)02:44 ID:/IOcm4EW(3/8) AAS
エスパー大会か?
(let ((i (+ i 1)))
(another-macro i))
another-macroは副作用目的で自明にiに展開したか、乗法的な関数を呼んだ(iの初期値0*n=0)
567: 2023/01/11(水)03:33 ID:4gRHy1NM(1) AAS
>>565
gancheは知らんけど、さすがにletはプリミティブな事が多いかと
むしろ最適化で読み飛ばすならlambdaまで還元してしまってはダメで、LETをヒューリスティックに認識する必要がある
仮に評価順を示す為にバッククォートでわざとらしく書くと
`(let ((,index ,(1+ stride))) ,(* index stride))
; (LET ((0 1)) 0)
(に等価な)展開とかがありがちかな
特に例に意味は無かったってオチだったりして
568: 2023/01/11(水)03:56 ID:/IOcm4EW(4/8) AAS
defmacro/macroexpand方式だと特にだけど、(let ((0 1)) 0)みたいな残骸から推論する技能はとても大事に思う
書く時もそうだけど、人が書いたモノの後始末なら前提知識が無いのでなおさら
これだけ想像を膨らませてくれる貴重な(let ((0 1)) 0)すら消し飛ばされるならもうお手上げ
なんて文句を言いつつ、schemeでもついslibのdefmacroに手が伸びてしまうのだが
569: 2023/01/11(水)06:03 ID:/IOcm4EW(5/8) AAS
>>565
論理的にどんなletが束縛リスト(とおそらくbodyも)を読み飛ばせるかについて補足
letフォームの評価値は最後のフォームの評価値(car (last 'let-form))のみで決まるけど、それが再束縛のできない自己評価オブジェクト(0, T/#t, :kw-symb etc)ならば、単にそれを返すだけで他を一切見る必要すら必要がない
(let dont-care/maybe-invalid self-evaluating)
→self-evaluating
もしそれ以上簡約してしまうと、(eq 'let (car 'let-form))と(car (last 'let-form))だけを見て決められない
570(1): 2023/01/11(水)06:21 ID:/IOcm4EW(6/8) AAS
一応値については正しいというだけで、もしbodyに(exit)や大域脱出が入ってても無視するのか?という問題はある
ill-formedな>>560すら無視するのだから、当然well-formedな(exit)も無視するのが自然だけど、実際のところはgaucheに訊いてください
571(1): はちみつ餃子 ◆8X2XSCHEME 2023/01/11(水)17:03 ID:s0T2WgwN(2/2) AAS
>>570
念のために補足しておくけど >>560 のケースは捕捉されないエラー
(現時点では捕捉することを意図的に諦めているエラー) であって
Gauche の仕様として正しいというわけではないよ。 結果は未定義。
直接的に書いてしまった場合にしてもマクロ展開結果でこうなるにしても
あくまでも誤っているプログラムだからね。
言いたかったのは >>557 に対してで、原理的に出来てもやらない事情の例として
(私は ECL のことは全然知らないので) Gauche での例を出したってだけ。
572(1): 2023/01/11(水)17:40 ID:/IOcm4EW(7/8) AAS
>>571
どうも、俺のも原理的には…という同じ意図の話だよ
eclやgaucheが有名実装では最もアグレッシブな感じなのかな?
(declaim (optimize (speed 0) debug safety)
が外せない俺には怖くて触れないよ
573: 2023/01/11(水)18:02 ID:/IOcm4EW(8/8) AAS
なおeclのlocked package?の件、標準の宣言を全て付けても有効な模様…
574: 2023/01/11(水)18:12 ID:qLQaVlgq(1) AAS
notinlineも効かないし独自機構だな
575: はちみつ餃子 ◆8X2XSCHEME 2023/01/14(土)01:01 ID:9ctkhBjT(1) AAS
>>572
> 有名実装では最もアグレッシブ
そんなことはないんじゃないかな。。
実行前の処理に時間をかけない (かけても総合的な性能向上にならない) という
判断でエラーチェックに消極的だけど最適化にも消極的だから。
576: 本田 2023/01/25(水)23:58 ID:PahnnjBC(1) AAS
UCB Scheme
外部リンク:people.eecs.berkeley.edu
UCB Scheme is a modified version of STk 4.0.1 by Erick Gallesio.
577: 2023/01/26(木)19:06 ID:lq03KzKz(1) AAS
USB Schemeじゃないのか
どっちかって言えばUSB Schemeが欲しいのだが
578: 2023/01/28(土)14:07 ID:BDgiT21v(1) AAS
nptcl
外部リンク:github.com
579: 本田 2023/01/29(日)22:24 ID:XMFhzyDs(1) AAS
アルゴリズム言語 Scheme 報告書 四訂版
H. Suzuki訳
外部リンク[texi]:groups.csail.mit.edu
580: はちみつ餃子 ◆8X2XSCHEME 2023/01/30(月)00:59 ID:kRDQpz8S(1) AAS
そのリンクがどうしたっていうんだ?
何か思うところがあるなら話題に挙げるのはかまわんが
ただリンクを置いて去るのはやめて欲しいな。
ニュース系のネタならお知らせの意味で貼ったのかなと思うところだが、
そういう感じでもないみたいだしな。
581(3): 2023/01/30(月)19:13 ID:prACFehy(1) AAS
そもそもダイナミックスコープの何がだめですか
Emacs lispはダイナミックスコープですが、
あちこちから呼ばれてる関数を、空関数で上書きして殺すとかできて便利です
Emacs lispの感覚でGIMPのスクリプト(scheme)を書こうとすると
なにか何でもかんでもラッパー渡し(いちいちcarをひとつ辿る)って感じです
ちなみにLispは普通の手続き型言語としてしか使ったことないです
そんな奴への説教とかあったら聞きたいです
マクロとか、「確かにif文を関数として実装するのは無理かもしれないし、
そういう時に使うのかな」くらいにしか解ってないです
582: 2023/01/30(月)19:45 ID:w7gs7hNq(1) AAS
>>581
全然ダメじゃないよ。でも誰か(昨日のオレ)が余計なことをやって不審な挙動をしてるけど原因がさっぱり分からないというのは起こりやすいかもしれない。
583: 2023/01/31(火)01:40 ID:t9l1A9G+(1) AAS
Lispではたまたまうまく動いてるように見えるけど変数宣言の無い言語でダイナミックスコープやると死ぬ
584: はちみつ餃子 ◆8X2XSCHEME 2023/01/31(火)10:19 ID:XA5Y5Qfu(1/3) AAS
>>581
元のプログラムを書き換えずに影響を差し込むことが出来るってのはアプリケーション拡張用として便利だけれど
元のプログラムが想定してない滅茶苦茶なことも出来ちゃうということと最適化が困難になるのが深刻な問題だと思う。
ユーザーが変な使い方をして変なことを起こす分には自業自得といえるにしても
今ではパッケージをネット上からダウンロードしてインストールまで自動だから
悪意あるコードが他のパッケージを好きなように変更できるようだと影響範囲が大きい。
たとえばウェブブラウザのアドオンなんかだど各アドオンは通信によって協調は出来るが
環境は共有しないようにすることで影響力を制限している。
参照しているものがことごとくいつでも変更される可能性があると
インライン化や畳み込みといったごく基本的な (しかし効果が高い) 最適化すらできない。
現代的な言語処理系に対して数十倍単位で遅いのはさすがに困る。
ものごとの良し悪しにはトレードオフがある。
どちらの問題もコードが小規模ならどうということはないので利点のほうが上回っていたのかもしれないが、
時代を経て巨大になりすぎた。 疎結合を意識した構成にしないと手に負えない。
585: 2023/01/31(火)10:34 ID:tSjB9eWW(1/7) AAS
グローバル&ダイナミックは罠になり得るけど、対話的に使うコマンド言語(シェル)は大体そうだし利便性の問題、新しいpwshでももそう
定義をテキストとして全てダンプして、読み戻せる利点がある
cl/scheme(fluid-letとかそんな名前の拡張)のように基本レキシカルで、ローカル&ダイナミックは宣言が必要なら意図せず使う事は稀なはず
(form-in-scope? (declare (special x)) form-in-scope)
(locally (declare (special x)) (form-in-scope))
面倒だけど(declare…)が外、つまり同じレベルのフォームに影響する場合があるのが気持ち悪いから、明示的な後者を好む
586: 2023/01/31(火)10:56 ID:tSjB9eWW(2/7) AAS
レキシカルな情報を取り込んでしまう(暗黙にクロージャを作る)クロージャにはテキスト表現が無いから、ダンプが出来ないのは致命的な欠点
よってダイナミックスコープ一択になる
pwshだと gci function:
bashだとdeclare -f (多分、よく知らん)
でダンプ、出力されるテキストを読み直せば(大体)環境が復元できる
pwsh方式だと{code}.GetNewClosure()でクロージャは明示的に得る
587(1): 2023/01/31(火)11:08 ID:tSjB9eWW(3/7) AAS
>>581
guileだっけ?
あれ変な拡張山盛りだから出来るんじゃない?fluid-letみたいな名前がないかaproposしてみたら
588(1): はちみつ餃子 ◆8X2XSCHEME 2023/01/31(火)11:28 ID:XA5Y5Qfu(2/3) AAS
>>587
GIMP の Scheme (Script-fu) は TinyScheme が使われている。 (昔は SIOD だった。)
まあ fluid-let くらいなら自分で書いてもたいした手間じゃないけどね。
上下前次1-新書関写板覧索設栞歴
あと 267 レスあります
スレ情報 赤レス抽出 画像レス抽出 歴の未読スレ
ぬこの手 ぬこTOP 0.014s