Lisp Scheme Part41 (855レス)
1-

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正規化あたりと絡めて展開すればよりアカデミックなやりとりが期待できるのでは?
771: 07/09(水)19:46 ID:QwaFNVYh(8/8) AAS
map系の関数にラムダ式を渡したら、それがインライン展開されてコンパイルされるのは、最近の言語では当然の様にやってる
772
(2): 07/09(水)22:06 ID:cmuoaTCa(9/10) AAS
>>770
letでローカル変数3つ確保しましたって時に
実際には内部でlambdaが呼ばれてるわけだろ?
この時にlambdaをインライン展開したら
オペランドスタックと返り値スタックが省かれて
変数スタックだけになって制御構造と同じコストになるだろ?
これは大きな最適化なんだよ
773
(1): はちみつ餃子 ◆8X2XSCHEME 07/09(水)22:54 ID:ZKntcAAj(7/7) AAS
>>772
let が lambda に展開される (させる) 例が仕様に書いてあるのはあくまでも挙動の説明に過ぎず、多くのリッチな処理系ではそんな展開はしない。
774
(1): 07/09(水)23:21 ID:cmuoaTCa(10/10) AAS
>>773
リッチでない処理系がこの最適化ひとつでリッチ同然になる
775: 07/09(水)23:40 ID:eQ8lOX87(4/4) AAS
テム・レイ最適化って呼ばせてほしい
776: 07/09(水)23:41 ID:QSSrKuoD(1) AAS
おかしな人が居ると捗るよね。でもまともなこと言ってる人もだんだんおかしなことをいいだして、実はおかしな人しかいなかったと気づかされる。
777: 07/10(木)00:52 ID:nn3AKhN3(1) AAS
(macroexpand '(let ((a 1) (b a) (c b)) c)) ;=>((lambda (a b c) c) 1 a b)
(macroexpand '(let* ((a 1) (b a) (c b)) c)) ;=>((lambda (a) ((lambda (b) ((lambda (c) c) b)) a)) 1)
(macroexpand '(letrec ((a 1) (b a) (c b)) c)) ;=>((lambda (a b c) (set! a 1) (set! b a) (set! c b) c) '() '() '())
あいあい いいいい 飛ばして えいえい おいおい 戻して うーいうい
778: 07/10(木)01:03 ID:qcnALR7R(1) AAS
>>772
そこに興味あるなら、この後CPS変換を調べるといいよ
その後関数をジェネレーターに変換して、yieldに対応出来たら一人前だよw
更にその後はAsync/Awaitが待っている
779
(1): はちみつ餃子 ◆8X2XSCHEME 07/10(木)07:45 ID:UMLMi9p2(1/2) AAS
>>774
let は 常に lambda に展開せねばならず、引数の受け渡しはスタックを使うことという制約を入れて最適化の邪魔をしてまでひとつの最適化を入れる?
馬鹿馬鹿しい。
1-
あと 76 レスあります
スレ情報 赤レス抽出 画像レス抽出 歴の未読スレ

ぬこの手 ぬこTOP 0.021s