Lisp Scheme Part41 (855レス)
Lisp Scheme Part41 http://mevius.5ch.net/test/read.cgi/tech/1531587928/
上
下
前
次
1-
新
通常表示
512バイト分割
レス栞
417: デフォルトの名無しさん [sage] 2021/07/13(火) 19:58:17.06 ID:tejz1RXC 数字はreadした時点でnumberになる それをquoteしてもnumberのまま quoteするとはevalされないということだ もちろんnumberをevalしてもnumberのままだ http://mevius.5ch.net/test/read.cgi/tech/1531587928/417
418: デフォルトの名無しさん [sage] 2021/07/14(水) 06:57:41.65 ID:O4vE2Kew あっそうか 末尾再帰が仕様にないからloopを使うようになってるのかな? http://mevius.5ch.net/test/read.cgi/tech/1531587928/418
419: デフォルトの名無しさん [sage] 2021/07/15(木) 04:52:42.37 ID:eqEigNI9 逆やね末尾再帰でloopを代替できるからイキって仕様からloopを消したったのがschemeやからユーザーもイキるやで http://mevius.5ch.net/test/read.cgi/tech/1531587928/419
420: デフォルトの名無しさん [sage] 2021/07/15(木) 06:43:25.74 ID:S7wkmjz6 末尾呼び出しの最適化が至高の技術のように思っていた時期が僕にもありました http://mevius.5ch.net/test/read.cgi/tech/1531587928/420
421: はちみつ餃子 ◆8X2XSCHEME [sage] 2021/07/15(木) 11:32:01.61 ID:d93moyXm 末尾呼出し最適化はあくまでもセマンティクスの話であって、 ループ構文を避ける強い流れがあるわけじゃないよ。 do や named let くらいしか繰り返し構文が用意されてないのは 皆が合意できる仕様をまとめられていないという非常に単純な理由だよ。 R7RS-Large に入れるループ構文の候補としては ・ SRFI-42 (https://srfi.schemers.org/srfi-42/srfi-42.html) ・ foof-loop (http://wiki.call-cc.org/eggref/5/foof-loop) ・ chibi loop (http://synthcode.com/scheme/chibi/lib/chibi/loop.html) が挙がっている。 まあまだちゃんと議論されてないので他の候補が出るかもしれないし、 結局何も入れないということもあるかもね。 http://mevius.5ch.net/test/read.cgi/tech/1531587928/421
422: デフォルトの名無しさん [sage] 2021/07/15(木) 16:04:48.23 ID:MIyHkZEB アキュムレータ加えて末尾再帰で書くよりはdoを好むわ ロジックとしては全く等価だし、見やすい方がいい http://mevius.5ch.net/test/read.cgi/tech/1531587928/422
423: デフォルトの名無しさん [sage] 2021/07/15(木) 16:12:57.83 ID:MIyHkZEB loopキーワードは:を付けてlisp keywordにすればビジュアル的に随分見やすくなるね ところでloopの独特の言い回しはAlgol由来だと最近知った、downtoとか esacやfiまで取り入れてたら投げ捨てるけど http://mevius.5ch.net/test/read.cgi/tech/1531587928/423
424: デフォルトの名無しさん [sage] 2021/07/15(木) 16:15:28.68 ID:MIyHkZEB >>412 sbclが内部でnlet使ってるね ::で参照したりコピペしたりしてるわ やっぱclに入れた方が良かったな http://mevius.5ch.net/test/read.cgi/tech/1531587928/424
425: デフォルトの名無しさん [sage] 2021/07/15(木) 16:34:32.82 ID:zKeMNTWP loopしなくてもdestructuring bindやwithの為にloop使うのは我ながら良くないと思う 値を集める節がハマると簡潔に書けるのでつい http://mevius.5ch.net/test/read.cgi/tech/1531587928/425
426: はちみつ餃子 ◆8X2XSCHEME [sage] 2021/07/15(木) 17:45:11.96 ID:d93moyXm 慣れた Scheme ユーザーなら末尾呼出し (末尾再帰) になっているかどうかは空気のように判断できるけど、 do で書けるものなら do で書いたほうがそういう判断をする必要さえないわけで、 なるべく抽象度の高い構文 (または手続き) を使うに越したことはない。 大事なのは抽象化で、繰り返しをしているところなら繰り返しに見えるように書くのが筋だろ。 (繰り返しに do という名前を当てるのがどうなんだ……とも思うけど Fortran 由来らしい。) そういう意味では >>425 が loop をループ以外の用途に使うのは確かに良くは無いんだが、 場合によってはそういうのもイディオムとして定着していることがあるから 意味に忠実にするために冗長になるくらいならイディオムに頼るほうが「わかりやすい」場合もある。 どちらがいいというわけでもなくて全体の匙加減だから難しいよね。 http://mevius.5ch.net/test/read.cgi/tech/1531587928/426
427: デフォルトの名無しさん [sage] 2021/07/15(木) 19:48:28.17 ID:eqEigNI9 末尾呼出し最適化をいかした書き方というのは確かにあるのだけれど named let はシンプルな loop に特化していて中途半端なのだよなあ http://mevius.5ch.net/test/read.cgi/tech/1531587928/427
428: デフォルトの名無しさん [sage] 2021/07/15(木) 21:29:35.37 ID:hFBqwrB0 named let 嫌いだわ、構文として紛らわしいだけ あれはgotoとでも名乗るべき http://mevius.5ch.net/test/read.cgi/tech/1531587928/428
429: デフォルトの名無しさん [sage] 2021/07/16(金) 08:09:46.64 ID:IT8DyczJ >>428 おいらはすき。letなんてどうせシンタックスシュガー。 http://mevius.5ch.net/test/read.cgi/tech/1531587928/429
430: デフォルトの名無しさん [sage] 2021/07/18(日) 09:56:21.45 ID:2Hl3gQcn 書き捨てなら抽象度は低い方がよいのが原則じゃないか? 高いほうがいいのは使い回すケース、例えば数列計算関数に項を計算する関数を渡して特殊化したい場合 carがdoなら、何がしたいのか一目で分かるよね あとclでも普通ループへの展開はしてくれると思うけど、保証はされてないから神経質な人は、より確実に等価なコードに展開されるだろうdoの方がいいかも いやさすがに気にし過ぎか http://mevius.5ch.net/test/read.cgi/tech/1531587928/430
431: はちみつ餃子 ◆8X2XSCHEME [sage] 2021/07/18(日) 10:09:27.74 ID:+Ch+KzUq >>430 > 書き捨てなら抽象度は低い方がよいのが原則じゃないか? 手間とのトレードオフで抽象化層をわざわざ作るのを避けるという意味ならそうだけど、 多様な語彙 (標準ライブラリ、またはそれに近いもの) がすでに揃っている中 から選べるなら状況をより適切に表しているものをピックアップしたほうが わかりやすいし手間も少ないでしょ。 http://mevius.5ch.net/test/read.cgi/tech/1531587928/431
432: デフォルトの名無しさん [sage] 2021/07/18(日) 10:13:20.17 ID:2Hl3gQcn ポエムだけど、状態機械ともロジックは等価だよね 二項漸化式を例に 仮引数-呼び出し 末尾再帰 a b accum - b (next b) accum' do a b result - b (next b) result' 状態機械 a b state - b (next b) state' 状態機械は普通遷移テーブルを与えて考えるけど、制御構造で動的に割り振れば前の二者になる 状態を引数で受け渡すことで、ステートフルな計算を実現する http://mevius.5ch.net/test/read.cgi/tech/1531587928/432
433: デフォルトの名無しさん [sage] 2021/07/18(日) 10:18:13.98 ID:2Hl3gQcn >>431 その文章には賛同するけど、その線引は深入りすると宗教戦争になりそうなやつだな… 忘れてくれ http://mevius.5ch.net/test/read.cgi/tech/1531587928/433
434: デフォルトの名無しさん [sage] 2021/07/18(日) 10:31:34.34 ID:2Hl3gQcn 'formをテーブルに書き込んでしまえば… http://mevius.5ch.net/test/read.cgi/tech/1531587928/434
435: デフォルトの名無しさん [sage] 2021/07/18(日) 10:43:00.23 ID:iK76XXqo 状態機械の定義にそぐうかは詳しくないので分からないけど、表で管理するのは見やすそう でもデータ構造中に保持する限り反復に翻訳される可能性は皆無だろうな http://mevius.5ch.net/test/read.cgi/tech/1531587928/435
436: デフォルトの名無しさん [sage] 2021/07/18(日) 22:30:22.92 ID:wZnHH9/v do構文は何がどこかすぐ忘れる named letはうる覚えでもなんとかなる ただのletの亜種だから断然読みやすい http://mevius.5ch.net/test/read.cgi/tech/1531587928/436
437: デフォルトの名無しさん [] 2021/07/18(日) 22:33:40.35 ID:3JZJIWfz ×うる覚え ○うろ覚え http://mevius.5ch.net/test/read.cgi/tech/1531587928/437
438: デフォルトの名無しさん [sage] 2021/07/20(火) 02:01:05.64 ID:DJlNseKm すみませんscheme初心者なのですが累乗を求めるプログラムが動きません http://www.nct9.ne.jp/m_hiroi/func/abcscm04.html を参考に、let と cond を使って書いてみたのですが let で局所変数を導入した瞬間に動かなくなりました 何が間違っているのか指摘していただけると幸いです (define (pow x y) (let ((z (pow x (quotient y 2)))) (cond ((zero? y) 1) ((zero? (modulo y 2)) (* z z)) (else (* x z z)) ) ) ) http://mevius.5ch.net/test/read.cgi/tech/1531587928/438
439: デフォルトの名無しさん [sage] 2021/07/20(火) 02:30:15.19 ID:yRdGIeGP infinite recursion http://mevius.5ch.net/test/read.cgi/tech/1531587928/439
440: デフォルトの名無しさん [sage] 2021/07/20(火) 03:11:09.60 ID:DJlNseKm (z (pow x...)) の評価が ((zero? y) 1) の前に起きてるのが原因なんですね z に (pow x..) を束縛だけして評価しないみたいなことって出来るんですかね? (define (pow2 x y) (if (= y 0) 1 (let ((z (pow2 x (quotient y 2)))) (if (= (modulo y 2) 0) (* z z) (* x z z))))) みたいに if 文に分解して (= y 0) 1 を (let ((z (pow2 x ..) の前に出すしかないんでしょうか let と cond を一緒に使うとスッキリ書けそうなのですが… http://mevius.5ch.net/test/read.cgi/tech/1531587928/440
441: デフォルトの名無しさん [sage] 2021/07/20(火) 09:22:43.66 ID:0xL9gg55 (define (pow x y) (let ((z (lambda()(pow x (quotient y 2))))) (cond ((zero? y) 1) ((zero? (modulo y 2)) (* (z) (z))) (else (* x (z) (z)))))) http://mevius.5ch.net/test/read.cgi/tech/1531587928/441
442: デフォルトの名無しさん [sage] 2021/07/20(火) 10:43:12.24 ID:aBN0Hnxa 計算量悪化してない? http://mevius.5ch.net/test/read.cgi/tech/1531587928/442
443: デフォルトの名無しさん [sage] 2021/07/20(火) 11:23:57.77 ID:0xL9gg55 (define (pow x y) (let ((z (lambda()(pow x (quotient y 2))))) (cond ((zero? y) 1) ((zero? (modulo y 2)) (set! z (z)) (* z z)) (else (set! z (z)) (* x z z))))) http://mevius.5ch.net/test/read.cgi/tech/1531587928/443
444: デフォルトの名無しさん [sage] 2021/07/20(火) 12:21:34.41 ID:27sTwTCb ifとletを使うのが一番いいと思う (define (pow1 x y) (let ((z (delay (pow1 x (quotient y 2))))) (cond ((zero? y) 1) ((zero? (modulo y 2)) (* (force z) (force z))) (else (* x (force z) (force z)))))) (define (pow2 x y) (let ((z #f)) (cond ((zero? y) 1) ((begin (set! z (pow2 x (quotient y 2))) (zero? (modulo y 2))) (* z z)) (else (* x z z))))) http://mevius.5ch.net/test/read.cgi/tech/1531587928/444
445: デフォルトの名無しさん [sage] 2021/07/20(火) 12:42:50.05 ID:DJlNseKm >>443 なるほどアリティ0の無名関数として束縛してやれば定義時に評価されずに済むんですね 評価したいときはリストにすれば評価されると めちゃくちゃ為になりました ありがとうございます http://mevius.5ch.net/test/read.cgi/tech/1531587928/445
446: デフォルトの名無しさん [sage] 2021/07/20(火) 13:00:13.21 ID:DJlNseKm >>444 やはり自然なのはifとlet使った書き方なんですかね そもそも明示的に遅延評価を表すシンタックス形式(delay)があるんですね勉強になります ありがとうございました http://mevius.5ch.net/test/read.cgi/tech/1531587928/446
メモ帳
(0/65535文字)
上
下
前
次
1-
新
書
関
写
板
覧
索
設
栞
歴
あと 409 レスあります
スレ情報
赤レス抽出
画像レス抽出
歴の未読スレ
Google検索
Wikipedia
ぬこの手
ぬこTOP
0.017s