Lisp Scheme Part41 (855レス)
1-

741: 07/09(水)09:01 ID:IjsShBy4(1) AAS
わからん。コンパイラ頑張ります宣言ではないのか?
742: 07/09(水)09:07 ID:Bk08chKM(1) AAS
AIと壁打ちして「理解」した内容を妥当性の検証もしないまま書き込んでそうだな
743
(1): 07/09(水)09:37 ID:qReXyC09(3/3) AAS
ファーストラムダというのは

((lambda

この形のこと
つまり、lambdaを呼んで返ってきた関数オブジェクトを即座にもう一度呼んでる
このときに関数呼び出しをせず、インライン関数として展開してしまう
もちろんスタックフレームは作られない
letだとかwhileだとか、実質的に制御構造に過ぎないものは軒並みこの形をしている
744: 07/09(水)12:22 ID:EKMDM/sM(1) AAS
742
最近そういうの増えた
丸飲みコピペじゃなくて
消化してから吐き出して欲しい
745
(1): はちみつ餃子 ◆8X2XSCHEME 07/09(水)13:05 ID:ZKntcAAj(1/7) AAS
オペランドを評価しない関数 fexpr を導入することでスペシャルフォームを手続きと同列にファーストクラスオブジェクトとして扱うアイデアはあるよ。
それを整理して scheme 風言語として構築したものもある。
外部リンク[html]:web.cs.wpi.edu

まあそれはそれとして、
>>738
> 内部的に無名関数を呼ぶことで実装

と最適化の話を繋げるのは意味がわからんぞ。
処理系の実装方法の一部は言語仕様として強制すべきというのが前提になってる?
746
(1): 07/09(水)14:05 ID:cmuoaTCa(1/10) AAS
>>745
>処理系の実装方法の一部は言語仕様として強制すべきというのが前提になってる?

テイルコールはそうでしょ
最適化は処理系がやってくれることを保証するので
単純ループに相当するものでもどんどん再帰の形で書きましょうってことでしょ

ファーストラムダも同じ
制御構造相当のものをlambdaを使って書いても最適化されますよってこと
747: はちみつ餃子 ◆8X2XSCHEME 07/09(水)14:21 ID:ZKntcAAj(2/7) AAS
>>746
> テイルコールはそうでしょ
> 最適化は処理系がやってくれることを保証するので

仕様上は
・正しく末尾再帰が行われていること
・アクティブな末尾呼出しの回数制限がないなら正しく末尾再帰が出来ている
という迂遠な表現になっている。

つまり、何が出来るべきなのかという書き方であって、どう実装すべきかに言及することを避けてる。

同様に処理系のメカニズムに言及することを避けて提案を表現してみてよ。
748
(1): 07/09(水)14:35 ID:cmuoaTCa(2/10) AAS
テイルコールってのは

call func
ret

って並んでたら

jmp func

に置き換えるんだよ

ファーストラムダもある種の関数のインライン展開ってだけ
749
(1): はちみつ餃子 ◆8X2XSCHEME 07/09(水)14:40 ID:ZKntcAAj(3/7) AAS
>>748
テイルコールの説明なんか要らん。 知ってるから。
仕様を変える提案をするなら仕様書にどう書きたいのかで説明してくれと述べてる。
750
(1): 07/09(水)14:49 ID:cmuoaTCa(3/10) AAS
>>749

>>743
751: はちみつ餃子 ◆8X2XSCHEME 07/09(水)14:57 ID:ZKntcAAj(4/7) AAS
>>750
意味を為さない言葉を何万回繰り返したところで何も変わらんぞ。
妥当な文章を書く能力がないならもう出来ることはない。
論外。 終わり。
752: 07/09(水)15:02 ID:QwaFNVYh(1/8) AAS
>>740
ifだって普通の関数だろw
インタープリターとしての実装は単なる関数呼び出しだ
スペシャルフォームなので引数は評価せず渡す(通常の関数の場合は評価した結果を渡す)
で、(バイト)コンパイラーはifは関数呼び出しにはせず条件ジャンプ命令列に置き換える
そんな事は古代からやってる
自分で処理系を実装した事あれば誰でも知ってる
753: 07/09(水)15:28 ID:cmuoaTCa(4/10) AAS
マクロだっていう反論が来るのかと思ったらスペシャルフォームだというので戸惑ってるw
そりゃいくつかの関数はミニマルコアとして書かなきゃいけないさ

それさえあれば関数とマクロと制御構造は統一できる、というのが言い分
754: 07/09(水)15:34 ID:QwaFNVYh(2/8) AAS
ミニマルコアって何だ?
スペシャルフォームとマクロは引数を評価しないで渡す関数として実装される
そんなのは初期の頃からだと言っている
何で今さら発見した面してんのか?と言うことだ
755: 07/09(水)15:40 ID:QwaFNVYh(3/8) AAS
引数を評価しないで渡す関数という点で、マクロとスペシャルフォームは同一の実装と言える
しかしマクロは環境を受け取らないといけないし、戻り値を再度評価する必要があるから、スペシャルフォームとマクロは区別する必要がある
756: 07/09(水)15:42 ID:QwaFNVYh(4/8) AAS
更に、スペシャルフォームはifの様にコンパイラーが特殊なコンパイルをする必要があるので、普通の関数と区別する必要がある点も重要だ
757
(1): 07/09(水)15:45 ID:cmuoaTCa(5/10) AAS
評価しないで渡したい引数のうち、制御に関わるものならインラインクロージャでなんとかなりますよって話だよ
レキシカルにちゃんとしたクロージャをインライン展開される前提で引数として渡すんだよ
758: 07/09(水)15:46 ID:QwaFNVYh(5/8) AAS
しかしながら、普通の関数でもスペシャルフォームの様な特殊なコンパイルをしたい場合があるので、その為にコンパイラーマクロが存在する
ただほとんど使われない
759
(1): 07/09(水)15:48 ID:QwaFNVYh(6/8) AAS
>>757
インライン関数はマクロで実装できる
環境もちゃんとハンドリング出来るので、インラインクロージャーもマクロで実装可能だ
何がしたいのか良く分からない…
760: 07/09(水)15:50 ID:QwaFNVYh(7/8) AAS
mapcarに渡したlambdaをインライン展開したいと言うなら、mapcarを(コンパイラー)マクロにすれば可能だ
761: 07/09(水)15:56 ID:cmuoaTCa(6/10) AAS
>>759
テイルコールみたいにファーストラムダ最適化も必須にすればインライン展開される分速くなる
762: はちみつ餃子 ◆8X2XSCHEME 07/09(水)16:17 ID:ZKntcAAj(5/7) AAS
最適化するために仕様の改定が必要か?
763: 07/09(水)16:32 ID:eQ8lOX87(2/4) AAS
>>738
どのへんが既出なんだか教えてほしいということならALGOLとサンクのコンパイル研究あたりで出尽していると思うから60年前には既に研究レベルでなく, 実践されていたのではないか.AIにきいてもわからなかったか?
AIに尋ねたら1960年代初頭でサンクのインライン展開も含めてアイデアは出尽しているといわれた.
ついでにSMALLTALKとIFとブロックについても調べてみろよ.
LISPの関数呼び出しの最適化についてもおまえは50年前あたりの認識をしている. 当然SBCLあたりの最適化はおまえよりずっと先をいってる.
764: 07/09(水)17:07 ID:ohpjpVt+(1/2) AAS
>ファーストラムダというのは
「ファーストラムダ」という言葉は、通常、AWS Lambdaを指すスラングとして使われることがあります。AWS Lambdaは、サーバーレスコンピューティングサービスで、コードをサーバーの管理なしに実行できます。
765
(1): 07/09(水)17:09 ID:cmuoaTCa(7/10) AAS
インライン展開を俺が発明したなんて言ってないだろ
この形をしたラムダをそうすると効くんじゃないかというのが俺の発明だ

あと、クロージャを引数として渡すのもSmalltalkやRubyはやってるだろう
俺の発明は「インライン関数を引数として渡すという逆接はものごとを見通しよくしますよ」だ
766: 07/09(水)17:25 ID:ohpjpVt+(2/2) AAS
そうやってevalの時点で評価されなかった式を何時どうやって誰が適用するのか
というおとぎ話を自慢毛に語るスレ
767: 07/09(水)17:29 ID:cmuoaTCa(8/10) AAS
evalはインタープリタ、lambdaはコンパイラ
768: はちみつ餃子 ◆8X2XSCHEME 07/09(水)18:09 ID:ZKntcAAj(6/7) AAS
Scheme はコンパイル結果を気楽に見る方法がないことも多いんだけど……
Gauche だと disasm で見れる。

(define (foo x y) ((lambda(a b)(+ a b)) x y))
(define (bar x y) (+ x y))
(disasm foo)
(disasm bar)

表示の意味がわからなくても foo と bar が同じになっていることはわかるだろう。
(バージョンによるかも?)
ごく普通にそういう最適化はしてる。
769: 07/09(水)18:36 ID:CwmzIZ1x(1) AAS
自分で処理系書いてから言え
770
(1): 07/09(水)19:18 ID:eQ8lOX87(3/4) AAS
>>765
少なくともLISP界隈では発明では全くないからHaskell, OCaml, コンパイラの最適化方面のスレで展開してみたら?
A正規化あたりと絡めて展開すればよりアカデミックなやりとりが期待できるのでは?
1-
あと 85 レスあります
スレ情報 赤レス抽出 画像レス抽出 歴の未読スレ

ぬこの手 ぬこTOP 0.013s