Lisp Scheme Part41 (855レス)
1-

409: 2021/07/12(月)20:42 ID:O01P9WLY(1) AAS
named let使おうと思ったらCommon lispには無かった
410: 2021/07/12(月)22:45 ID:u5zIJQm8(1) AAS
(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で書けなくもないと思うけど
411: 2021/07/12(月)23:10 ID:eka9NNGK(1) AAS
現代のlispハッカーはみんなloopマクロ使ってるよ
412
(1): 2021/07/13(火)08:34 ID:egse1qJT(1) AAS
named-lambdaならalexandriaにある
413
(1): 2021/07/13(火)10:27 ID:A078Hhon(1) AAS
Schemeで、

(+ '3 3)

を評価すると

6

が返ります。

'3 は「3」というシンボルを表わすのではないんですか?
414: はちみつ餃子 ◆8X2XSCHEME 2021/07/13(火)11:05 ID:jDPJbhfl(1) AAS
>>413
クウォートは評価を抑制するという仕組み。
データ (S式) の世界がプログラムの世界にマッピングされるときにデータの世界のままで留め置く感じ。

識別子はデータの世界ではシンボルなので、(変数として) 評価しなければシンボル自体となる。
3 はデータの世界でも数値の 3 であり、数値はプログラムの世界で評価すると
それ自体になるという自己評価 (self-evaluating) という規則の対象なので
3 はクウォートを付けても付けなくても評価結果は数値の 3 。

ちなみにベクタリテラルが自己評価の対象になるかどうかは変更があったので注意が必要。
R5RS/R6RS では自己評価の対象ではないのでクウォートが必要だが R7RS では自己評価になる。
まあほとんどの処理系は適当に許容したりもするんだけど。
415: 2021/07/13(火)16:32 ID:NGIJbx4Y(1) AAS
number?で#tなだけで数値をシンボルで実装した処理系もあるかもしれん
416: はちみつ餃子 ◆8X2XSCHEME 2021/07/13(火)17:10 ID:QSkHhbzy(1) AAS
小さい数値はヒープアロケーションせずにワードに詰め込む (ことで GC 削減して高速化を図る)
ような実装が一般的だったり、同じ内容の文字列リテラルを統合したりすることがある。

eq? が数値や文字列について処理系依存になっているのは
おそらくそういった最適化を許すための配慮なんだけど、
処理が遅くなってでも一貫した扱いをするというデザインを選んだなら
内部的に数値とシンボルと統合することも選択肢としてはあるかもね。

そうしてもユーザー視点ではたいして得なことはないんだけど、
アプリケーションに組み込んで拡張用言語として使うとか
だったらアプリケーション側の事情と馴染みやすいかどうかみたいな視点もあるし。
417: 2021/07/13(火)19:58 ID:tejz1RXC(1) AAS
数字はreadした時点でnumberになる
それをquoteしてもnumberのまま
quoteするとはevalされないということだ
もちろんnumberをevalしてもnumberのままだ
418: 2021/07/14(水)06:57 ID:O4vE2Kew(1) AAS
あっそうか
末尾再帰が仕様にないからloopを使うようになってるのかな?
419: 2021/07/15(木)04:52 ID:eqEigNI9(1/2) AAS
逆やね末尾再帰でloopを代替できるからイキって仕様からloopを消したったのがschemeやからユーザーもイキるやで
420: 2021/07/15(木)06:43 ID:S7wkmjz6(1) AAS
末尾呼び出しの最適化が至高の技術のように思っていた時期が僕にもありました
421: はちみつ餃子 ◆8X2XSCHEME 2021/07/15(木)11:32 ID:d93moyXm(1/2) AAS
末尾呼出し最適化はあくまでもセマンティクスの話であって、
ループ構文を避ける強い流れがあるわけじゃないよ。

do や named let くらいしか繰り返し構文が用意されてないのは
皆が合意できる仕様をまとめられていないという非常に単純な理由だよ。

R7RS-Large に入れるループ構文の候補としては
・ SRFI-42 (外部リンク:srfi.schemers.org
・ foof-loop (外部リンク:wiki.call-cc.org
・ chibi loop (外部リンク:synthcode.com
が挙がっている。

まあまだちゃんと議論されてないので他の候補が出るかもしれないし、
結局何も入れないということもあるかもね。
422: 2021/07/15(木)16:04 ID:MIyHkZEB(1/3) AAS
アキュムレータ加えて末尾再帰で書くよりはdoを好むわ
ロジックとしては全く等価だし、見やすい方がいい
423: 2021/07/15(木)16:12 ID:MIyHkZEB(2/3) AAS
loopキーワードは:を付けてlisp keywordにすればビジュアル的に随分見やすくなるね

ところでloopの独特の言い回しはAlgol由来だと最近知った、downtoとか
esacやfiまで取り入れてたら投げ捨てるけど
424: 2021/07/15(木)16:15 ID:MIyHkZEB(3/3) AAS
>>412
sbclが内部でnlet使ってるね
::で参照したりコピペしたりしてるわ

やっぱclに入れた方が良かったな
425
(1): 2021/07/15(木)16:34 ID:zKeMNTWP(1) AAS
loopしなくてもdestructuring bindやwithの為にloop使うのは我ながら良くないと思う
値を集める節がハマると簡潔に書けるのでつい
426: はちみつ餃子 ◆8X2XSCHEME 2021/07/15(木)17:45 ID:d93moyXm(2/2) AAS
慣れた Scheme ユーザーなら末尾呼出し (末尾再帰) になっているかどうかは空気のように判断できるけど、
do で書けるものなら do で書いたほうがそういう判断をする必要さえないわけで、
なるべく抽象度の高い構文 (または手続き) を使うに越したことはない。

大事なのは抽象化で、繰り返しをしているところなら繰り返しに見えるように書くのが筋だろ。
(繰り返しに do という名前を当てるのがどうなんだ……とも思うけど Fortran 由来らしい。)

そういう意味では >>425 が loop をループ以外の用途に使うのは確かに良くは無いんだが、
場合によってはそういうのもイディオムとして定着していることがあるから
意味に忠実にするために冗長になるくらいならイディオムに頼るほうが「わかりやすい」場合もある。

どちらがいいというわけでもなくて全体の匙加減だから難しいよね。
427: 2021/07/15(木)19:48 ID:eqEigNI9(2/2) AAS
末尾呼出し最適化をいかした書き方というのは確かにあるのだけれど named let はシンプルな loop に特化していて中途半端なのだよなあ
428
(1): 2021/07/15(木)21:29 ID:hFBqwrB0(1) AAS
named let 嫌いだわ、構文として紛らわしいだけ
あれはgotoとでも名乗るべき
429: 2021/07/16(金)08:09 ID:IT8DyczJ(1) AAS
>>428
おいらはすき。letなんてどうせシンタックスシュガー。
430
(1): 2021/07/18(日)09:56 ID:2Hl3gQcn(1/4) AAS
書き捨てなら抽象度は低い方がよいのが原則じゃないか?
高いほうがいいのは使い回すケース、例えば数列計算関数に項を計算する関数を渡して特殊化したい場合
carがdoなら、何がしたいのか一目で分かるよね

あとclでも普通ループへの展開はしてくれると思うけど、保証はされてないから神経質な人は、より確実に等価なコードに展開されるだろうdoの方がいいかも
いやさすがに気にし過ぎか
431
(1): はちみつ餃子 ◆8X2XSCHEME 2021/07/18(日)10:09 ID:+Ch+KzUq(1) AAS
>>430
> 書き捨てなら抽象度は低い方がよいのが原則じゃないか?

手間とのトレードオフで抽象化層をわざわざ作るのを避けるという意味ならそうだけど、
多様な語彙 (標準ライブラリ、またはそれに近いもの) がすでに揃っている中
から選べるなら状況をより適切に表しているものをピックアップしたほうが
わかりやすいし手間も少ないでしょ。
432: 2021/07/18(日)10:13 ID:2Hl3gQcn(2/4) AAS
ポエムだけど、状態機械ともロジックは等価だよね

二項漸化式を例に
仮引数-呼び出し
末尾再帰
a b accum - b (next b) accum'
do
a b result - b (next b) result'
状態機械
a b state - b (next b) state'

状態機械は普通遷移テーブルを与えて考えるけど、制御構造で動的に割り振れば前の二者になる
状態を引数で受け渡すことで、ステートフルな計算を実現する
433: 2021/07/18(日)10:18 ID:2Hl3gQcn(3/4) AAS
>>431
その文章には賛同するけど、その線引は深入りすると宗教戦争になりそうなやつだな…

忘れてくれ
434: 2021/07/18(日)10:31 ID:2Hl3gQcn(4/4) AAS
'formをテーブルに書き込んでしまえば…
435: 2021/07/18(日)10:43 ID:iK76XXqo(1) AAS
状態機械の定義にそぐうかは詳しくないので分からないけど、表で管理するのは見やすそう
でもデータ構造中に保持する限り反復に翻訳される可能性は皆無だろうな
436: 2021/07/18(日)22:30 ID:wZnHH9/v(1) AAS
do構文は何がどこかすぐ忘れる
named letはうる覚えでもなんとかなる
ただのletの亜種だから断然読みやすい
437: 2021/07/18(日)22:33 ID:3JZJIWfz(1) AAS
×うる覚え
○うろ覚え
438: 2021/07/20(火)02:01 ID:DJlNseKm(1/4) AA×

外部リンク[html]:www.nct9.ne.jp
1-
あと 417 レスあります
スレ情報 赤レス抽出 画像レス抽出 歴の未読スレ

ぬこの手 ぬこTOP 0.032s