Lisp Scheme Part41 (855レス)
Lisp Scheme Part41 http://mevius.5ch.net/test/read.cgi/tech/1531587928/
上
下
前
次
1-
新
通常表示
512バイト分割
レス栞
409: デフォルトの名無しさん [sage] 2021/07/12(月) 20:42:52.24 ID:O01P9WLY named let使おうと思ったらCommon lispには無かった http://mevius.5ch.net/test/read.cgi/tech/1531587928/409
410: デフォルトの名無しさん [sage] 2021/07/12(月) 22:45:17.08 ID:u5zIJQm8 (let loop ((n 10)) (if (> n 0) (loop (- n 1)) #t)) ↓ (((lambda (loop) (set! loop (lambda (n) (if (> n 0) (loop (- n 1)) #t))) loop) 'dummy-label) 10) こういう仕組みだからCLで書けなくもないと思うけど http://mevius.5ch.net/test/read.cgi/tech/1531587928/410
411: デフォルトの名無しさん [sage] 2021/07/12(月) 23:10:07.08 ID:eka9NNGK 現代のlispハッカーはみんなloopマクロ使ってるよ http://mevius.5ch.net/test/read.cgi/tech/1531587928/411
412: デフォルトの名無しさん [sage] 2021/07/13(火) 08:34:35.37 ID:egse1qJT named-lambdaならalexandriaにある http://mevius.5ch.net/test/read.cgi/tech/1531587928/412
413: デフォルトの名無しさん [sage] 2021/07/13(火) 10:27:19.42 ID:A078Hhon Schemeで、 (+ '3 3) を評価すると 6 が返ります。 '3 は「3」というシンボルを表わすのではないんですか? http://mevius.5ch.net/test/read.cgi/tech/1531587928/413
414: はちみつ餃子 ◆8X2XSCHEME [sage] 2021/07/13(火) 11:05:03.90 ID:jDPJbhfl >>413 クウォートは評価を抑制するという仕組み。 データ (S式) の世界がプログラムの世界にマッピングされるときにデータの世界のままで留め置く感じ。 識別子はデータの世界ではシンボルなので、(変数として) 評価しなければシンボル自体となる。 3 はデータの世界でも数値の 3 であり、数値はプログラムの世界で評価すると それ自体になるという自己評価 (self-evaluating) という規則の対象なので 3 はクウォートを付けても付けなくても評価結果は数値の 3 。 ちなみにベクタリテラルが自己評価の対象になるかどうかは変更があったので注意が必要。 R5RS/R6RS では自己評価の対象ではないのでクウォートが必要だが R7RS では自己評価になる。 まあほとんどの処理系は適当に許容したりもするんだけど。 http://mevius.5ch.net/test/read.cgi/tech/1531587928/414
415: デフォルトの名無しさん [sage] 2021/07/13(火) 16:32:31.52 ID:NGIJbx4Y number?で#tなだけで数値をシンボルで実装した処理系もあるかもしれん http://mevius.5ch.net/test/read.cgi/tech/1531587928/415
416: はちみつ餃子 ◆8X2XSCHEME [sage] 2021/07/13(火) 17:10:19.73 ID:QSkHhbzy 小さい数値はヒープアロケーションせずにワードに詰め込む (ことで GC 削減して高速化を図る) ような実装が一般的だったり、同じ内容の文字列リテラルを統合したりすることがある。 eq? が数値や文字列について処理系依存になっているのは おそらくそういった最適化を許すための配慮なんだけど、 処理が遅くなってでも一貫した扱いをするというデザインを選んだなら 内部的に数値とシンボルと統合することも選択肢としてはあるかもね。 そうしてもユーザー視点ではたいして得なことはないんだけど、 アプリケーションに組み込んで拡張用言語として使うとか だったらアプリケーション側の事情と馴染みやすいかどうかみたいな視点もあるし。 http://mevius.5ch.net/test/read.cgi/tech/1531587928/416
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
メモ帳
(0/65535文字)
上
下
前
次
1-
新
書
関
写
板
覧
索
設
栞
歴
あと 417 レスあります
スレ情報
赤レス抽出
画像レス抽出
歴の未読スレ
Google検索
Wikipedia
ぬこの手
ぬこTOP
0.017s