Lisp Scheme Part41 (856レス)
Lisp Scheme Part41 http://mevius.5ch.net/test/read.cgi/tech/1531587928/
上
下
前
次
1-
新
通常表示
512バイト分割
レス栞
556: デフォルトの名無しさん [sage] 2023/01/09(月) 16:57:44.09 ID:0CyucYY1 eclのlocked packageなる概念やcompile-timeの意味論に関連しそうなissue 2 yeas agoだけど https://gitlab.com/embeddable-common-lisp/ecl/-/issues/574 http://mevius.5ch.net/test/read.cgi/tech/1531587928/556
557: デフォルトの名無しさん [sage] 2023/01/10(火) 02:33:32.35 ID:/i8qCr3o >>553 特定の名前の解決を決め打つ言語は多いし、そういうポリシーもありだと思う 普通でないのはcondition(warning)を挙げないところ 決め打つ名前(locked package?)が分かってる限りは、flet/labelsのレキシカル束縛リストから拾った名前がbody内の呼び出しformのcarに存在するか、ランタイムコストの無い自明な静的解析でconditionを挙げられるはず http://mevius.5ch.net/test/read.cgi/tech/1531587928/557
558: デフォルトの名無しさん [sage] 2023/01/10(火) 03:18:54.37 ID:/i8qCr3o >>550 等価と思って良いよ 伝統的なlisp(とcl)のように(let ((x '())) ...)を(let (x) ...)と略記できない、だとか細かい差異はあるけど 百聞は一見にしかずなので、構文の対応を見るのが手っ取り早い あとeclのname collisionの件、consの例(>>553)はさすがにcontrived-exampleだと思うので、ついでにeclで破綻するように letrec/nlet/labels で定義するラベルとして、所謂accumulatorイディオムにloop(他にはlp, iterとか)を使うのが慣例だけど、eclではcl:loopと読まれるのでは?と予想 ;;; cl -- ok: cmucl, sbcl, clisp, gcl err:ecl (的中) (defun fact (n) (labels ((loop (k acc) (if (= k 0) acc (loop (1- k) (* k acc))))) (loop n 1))) ;;; scheme -- ok: guile (define (fact n) (letrec ((loop (lambda (k acc) (if (= k 0) acc (loop (1- k) (* k acc)))))) (loop n 1))) pcでテストはしたけど、スマホから手打ちなので変だったらごめん http://mevius.5ch.net/test/read.cgi/tech/1531587928/558
559: はちみつ餃子 ◆8X2XSCHEME [sage] 2023/01/10(火) 13:31:12.96 ID:TxpPtfKm >>557 スクリプト言語 (処理系) 的な想定だと実行開始時にテキストの解釈から毎回やるので 静的解析もランタイムの一部みたいな感じになる。 この場合に限って言えばどちらにせよ名前のルックアップはやるのだからそのときにわかるだろうとは思うけど 静的解析を頑張らないという方針はあり得るんじゃないの。 http://mevius.5ch.net/test/read.cgi/tech/1531587928/559
560: はちみつ餃子 ◆8X2XSCHEME [sage] 2023/01/11(水) 00:38:29.47 ID:s0T2WgwN Gauche で検出されないエラーで (let ((0 1)) 0) みたいなのがあって、 実際にはオプティマイザが消去してしまうんだそうな。 文法の解析で通したものをオプティマイザがエラーとして弾くのも変な話だし、 オプティマイザが走査することがわかっているものを前段階でもチェックするのは二度手間だし、 オプティマイザを密結合してしまうのも保守しづらいし…… という葛藤があるのはわかる。 まあそれぞれに事情があるので原理的に可能だからといってそうすべきだとも言えない気がする。 http://mevius.5ch.net/test/read.cgi/tech/1531587928/560
561: デフォルトの名無しさん [sage] 2023/01/11(水) 00:49:38.31 ID:LBEzL6fs 0はシンボルじゃないから、文法解析を通しちゃ駄目だろw http://mevius.5ch.net/test/read.cgi/tech/1531587928/561
562: デフォルトの名無しさん [sage] 2023/01/11(水) 01:29:07.80 ID:/IOcm4EW そういう手では絶対書かないだろう変なコードも、マクロ書いてるとまれによく発生するから困る http://mevius.5ch.net/test/read.cgi/tech/1531587928/562
563: デフォルトの名無しさん [sage] 2023/01/11(水) 01:59:04.27 ID:/IOcm4EW カウンタ変数を捕捉更新しようとして、うっかり評価してしまったケースとか http://mevius.5ch.net/test/read.cgi/tech/1531587928/563
564: デフォルトの名無しさん [sage] 2023/01/11(水) 02:21:26.04 ID:z40MB/0w 多分(let ((i (+ i 1))) i)が化けたのかな http://mevius.5ch.net/test/read.cgi/tech/1531587928/564
565: デフォルトの名無しさん [sage] 2023/01/11(水) 02:34:55.34 ID:LWIYKuEk letの時点でオプティマイザに通してんのかな let系はlambdaまで落として((lambda(i) i) (+ i 1))とすれば間違えようがないと思うのだが http://mevius.5ch.net/test/read.cgi/tech/1531587928/565
566: デフォルトの名無しさん [sage] 2023/01/11(水) 02:44:32.93 ID:/IOcm4EW エスパー大会か? (let ((i (+ i 1))) (another-macro i)) another-macroは副作用目的で自明にiに展開したか、乗法的な関数を呼んだ(iの初期値0*n=0) http://mevius.5ch.net/test/read.cgi/tech/1531587928/566
567: デフォルトの名無しさん [sage] 2023/01/11(水) 03:33:43.09 ID:4gRHy1NM >>565 gancheは知らんけど、さすがにletはプリミティブな事が多いかと むしろ最適化で読み飛ばすならlambdaまで還元してしまってはダメで、LETをヒューリスティックに認識する必要がある 仮に評価順を示す為にバッククォートでわざとらしく書くと `(let ((,index ,(1+ stride))) ,(* index stride)) ; (LET ((0 1)) 0) (に等価な)展開とかがありがちかな 特に例に意味は無かったってオチだったりして http://mevius.5ch.net/test/read.cgi/tech/1531587928/567
568: デフォルトの名無しさん [sage] 2023/01/11(水) 03:56:23.35 ID:/IOcm4EW defmacro/macroexpand方式だと特にだけど、(let ((0 1)) 0)みたいな残骸から推論する技能はとても大事に思う 書く時もそうだけど、人が書いたモノの後始末なら前提知識が無いのでなおさら これだけ想像を膨らませてくれる貴重な(let ((0 1)) 0)すら消し飛ばされるならもうお手上げ なんて文句を言いつつ、schemeでもついslibのdefmacroに手が伸びてしまうのだが http://mevius.5ch.net/test/read.cgi/tech/1531587928/568
569: デフォルトの名無しさん [sage] 2023/01/11(水) 06:03:42.65 ID:/IOcm4EW >>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))だけを見て決められない http://mevius.5ch.net/test/read.cgi/tech/1531587928/569
570: デフォルトの名無しさん [sage] 2023/01/11(水) 06:21:34.50 ID:/IOcm4EW 一応値については正しいというだけで、もしbodyに(exit)や大域脱出が入ってても無視するのか?という問題はある ill-formedな>>560すら無視するのだから、当然well-formedな(exit)も無視するのが自然だけど、実際のところはgaucheに訊いてください http://mevius.5ch.net/test/read.cgi/tech/1531587928/570
571: はちみつ餃子 ◆8X2XSCHEME [sage] 2023/01/11(水) 17:03:18.22 ID:s0T2WgwN >>570 念のために補足しておくけど >>560 のケースは捕捉されないエラー (現時点では捕捉することを意図的に諦めているエラー) であって Gauche の仕様として正しいというわけではないよ。 結果は未定義。 直接的に書いてしまった場合にしてもマクロ展開結果でこうなるにしても あくまでも誤っているプログラムだからね。 言いたかったのは >>557 に対してで、原理的に出来てもやらない事情の例として (私は ECL のことは全然知らないので) Gauche での例を出したってだけ。 http://mevius.5ch.net/test/read.cgi/tech/1531587928/571
572: デフォルトの名無しさん [sage] 2023/01/11(水) 17:40:33.93 ID:/IOcm4EW >>571 どうも、俺のも原理的には…という同じ意図の話だよ eclやgaucheが有名実装では最もアグレッシブな感じなのかな? (declaim (optimize (speed 0) debug safety) が外せない俺には怖くて触れないよ http://mevius.5ch.net/test/read.cgi/tech/1531587928/572
573: デフォルトの名無しさん [sage] 2023/01/11(水) 18:02:49.87 ID:/IOcm4EW なおeclのlocked package?の件、標準の宣言を全て付けても有効な模様… http://mevius.5ch.net/test/read.cgi/tech/1531587928/573
574: デフォルトの名無しさん [sage] 2023/01/11(水) 18:12:33.46 ID:qLQaVlgq notinlineも効かないし独自機構だな http://mevius.5ch.net/test/read.cgi/tech/1531587928/574
575: はちみつ餃子 ◆8X2XSCHEME [sage] 2023/01/14(土) 01:01:49.57 ID:9ctkhBjT >>572 > 有名実装では最もアグレッシブ そんなことはないんじゃないかな。。 実行前の処理に時間をかけない (かけても総合的な性能向上にならない) という 判断でエラーチェックに消極的だけど最適化にも消極的だから。 http://mevius.5ch.net/test/read.cgi/tech/1531587928/575
576: 本田 [] 2023/01/25(水) 23:58:21.43 ID:PahnnjBC UCB Scheme https://people.eecs.berkeley.edu/~bh/61a-pages/Scheme/ UCB Scheme is a modified version of STk 4.0.1 by Erick Gallesio. http://mevius.5ch.net/test/read.cgi/tech/1531587928/576
577: デフォルトの名無しさん [sage] 2023/01/26(木) 19:06:40.12 ID:lq03KzKz USB Schemeじゃないのか どっちかって言えばUSB Schemeが欲しいのだが http://mevius.5ch.net/test/read.cgi/tech/1531587928/577
578: デフォルトの名無しさん [sage] 2023/01/28(土) 14:07:46.81 ID:BDgiT21v nptcl https://github.com/nptcl/npt http://mevius.5ch.net/test/read.cgi/tech/1531587928/578
579: 本田 [] 2023/01/29(日) 22:24:48.67 ID:XMFhzyDs アルゴリズム言語 Scheme 報告書 四訂版 H. Suzuki訳 https://groups.csail.mit.edu/mac/ftpdir/scm/r4rs-ja.texi http://mevius.5ch.net/test/read.cgi/tech/1531587928/579
580: はちみつ餃子 ◆8X2XSCHEME [sage] 2023/01/30(月) 00:59:07.34 ID:kRDQpz8S そのリンクがどうしたっていうんだ? 何か思うところがあるなら話題に挙げるのはかまわんが ただリンクを置いて去るのはやめて欲しいな。 ニュース系のネタならお知らせの意味で貼ったのかなと思うところだが、 そういう感じでもないみたいだしな。 http://mevius.5ch.net/test/read.cgi/tech/1531587928/580
581: デフォルトの名無しさん [] 2023/01/30(月) 19:13:37.70 ID:prACFehy そもそもダイナミックスコープの何がだめですか Emacs lispはダイナミックスコープですが、 あちこちから呼ばれてる関数を、空関数で上書きして殺すとかできて便利です Emacs lispの感覚でGIMPのスクリプト(scheme)を書こうとすると なにか何でもかんでもラッパー渡し(いちいちcarをひとつ辿る)って感じです ちなみにLispは普通の手続き型言語としてしか使ったことないです そんな奴への説教とかあったら聞きたいです マクロとか、「確かにif文を関数として実装するのは無理かもしれないし、 そういう時に使うのかな」くらいにしか解ってないです http://mevius.5ch.net/test/read.cgi/tech/1531587928/581
582: デフォルトの名無しさん [sage] 2023/01/30(月) 19:45:34.45 ID:w7gs7hNq >>581 全然ダメじゃないよ。でも誰か(昨日のオレ)が余計なことをやって不審な挙動をしてるけど原因がさっぱり分からないというのは起こりやすいかもしれない。 http://mevius.5ch.net/test/read.cgi/tech/1531587928/582
583: デフォルトの名無しさん [sage] 2023/01/31(火) 01:40:41.84 ID:t9l1A9G+ Lispではたまたまうまく動いてるように見えるけど変数宣言の無い言語でダイナミックスコープやると死ぬ http://mevius.5ch.net/test/read.cgi/tech/1531587928/583
584: はちみつ餃子 ◆8X2XSCHEME [sage] 2023/01/31(火) 10:19:46.67 ID:XA5Y5Qfu >>581 元のプログラムを書き換えずに影響を差し込むことが出来るってのはアプリケーション拡張用として便利だけれど 元のプログラムが想定してない滅茶苦茶なことも出来ちゃうということと最適化が困難になるのが深刻な問題だと思う。 ユーザーが変な使い方をして変なことを起こす分には自業自得といえるにしても 今ではパッケージをネット上からダウンロードしてインストールまで自動だから 悪意あるコードが他のパッケージを好きなように変更できるようだと影響範囲が大きい。 たとえばウェブブラウザのアドオンなんかだど各アドオンは通信によって協調は出来るが 環境は共有しないようにすることで影響力を制限している。 参照しているものがことごとくいつでも変更される可能性があると インライン化や畳み込みといったごく基本的な (しかし効果が高い) 最適化すらできない。 現代的な言語処理系に対して数十倍単位で遅いのはさすがに困る。 ものごとの良し悪しにはトレードオフがある。 どちらの問題もコードが小規模ならどうということはないので利点のほうが上回っていたのかもしれないが、 時代を経て巨大になりすぎた。 疎結合を意識した構成にしないと手に負えない。 http://mevius.5ch.net/test/read.cgi/tech/1531587928/584
585: デフォルトの名無しさん [sage] 2023/01/31(火) 10:34:59.12 ID:tSjB9eWW グローバル&ダイナミックは罠になり得るけど、対話的に使うコマンド言語(シェル)は大体そうだし利便性の問題、新しいpwshでももそう 定義をテキストとして全てダンプして、読み戻せる利点がある cl/scheme(fluid-letとかそんな名前の拡張)のように基本レキシカルで、ローカル&ダイナミックは宣言が必要なら意図せず使う事は稀なはず (form-in-scope? (declare (special x)) form-in-scope) (locally (declare (special x)) (form-in-scope)) 面倒だけど(declare…)が外、つまり同じレベルのフォームに影響する場合があるのが気持ち悪いから、明示的な後者を好む http://mevius.5ch.net/test/read.cgi/tech/1531587928/585
メモ帳
(0/65535文字)
上
下
前
次
1-
新
書
関
写
板
覧
索
設
栞
歴
あと 271 レスあります
スレ情報
赤レス抽出
画像レス抽出
歴の未読スレ
Google検索
Wikipedia
ぬこの手
ぬこTOP
0.013s