Rust part26

■ このスレッドは過去ログ倉庫に格納されています
1デフォルトの名無しさん
垢版 |
2024/09/20(金) 22:18:38.38ID:c48cFuZJ
公式
https://www.rust-lang.org/
https://blog.rust-lang.org/
https://github.com/rust-lang/rust

公式ドキュメント
https://www.rust-lang.org/learn

Web上の実行環境
https://play.rust-lang.org

※Rustを学びたい人はまず最初に公式のThe Bookを読むこと
https://doc.rust-lang.org/book/

※Rustを学ぶ際に犯しがちな12の過ち
https://dystroy.org/blog/how-not-to-learn-rust

※Rustのasyncについて知りたければ「async-book」は必読
https://rust-lang.github.io/async-book/

※次スレは原則>>980が立てること

前スレ
Rust part25
https://mevius.5ch.net/test/read.cgi/tech/1722354386/

ワッチョイスレ
プログラミング言語 Rust 4【ワッチョイ】
https://mevius.5ch.net/test/read.cgi/tech/1514107621/
2024/10/18(金) 08:57:56.68ID:phux1vRq
>>340
旧帝大の工学系ってこんなにレベル低いのか
日本終わっとるな
352デフォルトの名無しさん
垢版 |
2024/10/18(金) 09:16:52.85ID:zss9wXA+
いやまあ>>338 の1と2は全然別のことを言ってるだろ
これで説明が足りないと感じる人はFirst class objectの意味を知らないとかか?
353デフォルトの名無しさん
垢版 |
2024/10/18(金) 09:31:39.70ID:ady3VKii
関数を組み合わせるってコンビネーターがないと組み合わせられないからね
ファーストクラス関数がないとコンビネーターは無理だからな
354デフォルトの名無しさん
垢版 |
2024/10/18(金) 09:32:07.67ID:zss9wXA+
解説したらワンパン終了というが、こう言う時の解説って案外難しいんだよな
相手が「first class object」の意味を知らないのか、「関数」の意味を知らないのか、日本語の文法を知らないのか、それとも文を読む気がないのか、はたまたレスバで勝ちたくて因縁付けてるだけなのか
相手の状態によって適切な解説は異なる。相手の知識をエスパーして解説を始めても意外とフィットしなくてワンパンで終わらない

掲示板でそこまでの手間をかけても、相手がレスバで勝ちたいだけだったら何も得られない。だから馬鹿にして去るのが最適解になってしまう。
2024/10/18(金) 11:13:30.31ID:wVDH4S6Q
>相手の知識をエスパーして解説を始めても意外とフィットしなくて

レスバが目的なら判らないフリしてるだけだからフィットする訳がない
2024/10/18(金) 11:20:18.93ID:/SvZNagR
>>348
その文言に騙されたヤツはほんと多いと思う
357デフォルトの名無しさん
垢版 |
2024/10/18(金) 13:34:55.49ID:io02HZIQ
>>339
例えばC言語の場合は関数は第一級オブジェクトじゃないけど、それは知ってる?
2024/10/18(金) 13:52:02.38ID:xbVzWiEk
>>353
「プログラムは関数定義の集合であり、関数呼び出しによってそれらを組み合わせる」と書いてあるようにコンビネーター前提とした関数の組み合わせの話ではないでしょ

それにコンビネーターなくても関数合成も可能だし関数がファーストクラスじゃなくてもファーストクラス関数風に扱える言語要素があればコンビネーターを使える

そもそも>>388の引用元が関数型の定義でも関数型言語の定義でもなくて関数型言語と呼ばれるものに多く見られる特徴の一部を列挙してものでしかないから関数型(言語)の定義だと思って読んではいけない
2024/10/18(金) 14:00:22.06ID:xbVzWiEk
>「1. プログラムは関数定義の集合であり、関数呼び出しによってそれらを組み合わせる。」

関数型言語でも関数定義以外にもモジュールや型や変数の定義があるので
関数定義の集合というと言い過ぎ

厳密な話ではなくプログラムの捉え方のようなざっくりした話であれば
C言語で書いた手続き型的なプログラムでも1は成り立つので
結局何が特徴だと言いたいのかわからない残念な文章
2024/10/18(金) 14:26:18.56ID:at3pRl/S
パラダイムはプログラムの構成の話なので、 C でオブジェクト指向的なプログラムを書いてもいいし関数指向的に書いてもいい。
言語としてクロージャがなくても構造体と関数の組をクロージャと見做して構成することも出来る。
ただ、なるべく直接的に言語の機能としてサポートがあるに越したことは無いし、常識的には言語が想定している形でプログラムを構成したほうが楽ってだけの話だ。

言語の機能での分類は「だいたいこっち寄り」くらいのことしか言えない曖昧なもんだわ。
2024/10/18(金) 17:16:35.88ID:0JUhcpKJ
>>358
一連のレスで唯一CSの教養を感じるわ
そのとおりであれは定義でもなんでもなく、手続き型言語に関数風味をつけた言語の紹介文でしかない
1,2が当然のように別物といってるやつは計算基礎論履修してないわな

それでも1をエスパーすると関数の集合でなく合成と訂正すればまぁ理解できる
となると関数がビルディングブロックなので2の説明は不要となる

あとファーストクラスオブジェクトってのも怪しい名称だわな
手続き型言語でインラインで関数定義できる程度のことをかっこつけて言ってるだけしか聞こえん
2024/10/18(金) 17:47:07.37ID:72lp8MJn
>>361
さすがにその理解で他人をけなすのは……

第一級オブジェクトはwikipedia参照したほうがいいな。意味としては「関数の定義域・値域として他のオブジェクトと同様に使える」ということだから、単にプログラマが使えるということでは無いよ。

>>338の1は関数の集合を定義域値域にできるとは言っていない。
2は関数集合(の部分集合)を定義域・値域にできるという話だから、基本的に1とは別の話。
363デフォルトの名無しさん
垢版 |
2024/10/18(金) 18:29:51.87ID:ady3VKii
>1. プログラムは関数定義の集合であり、
>関数呼び出しによってそれらを組み合わせる。
関数定義の集合はプログラムってことだから
例えば{fの定義,gの定義}はプログラムだろ
fの定義が f (x) =fの式 でgの定義が g (x) =gの式とすると
fの引数xにgを入れてを呼び出して f (g) =fの式の中のxをgに置き換えた式 になって
f ( g) =f式の中のxをgに置き換えた式 も関数定義だから
{fの定義、gの定義、fgの定義}もプログラムってことでしょ
3によってプログラムの実行とはfgの式とかを評価することでしょ
2024/10/18(金) 19:42:44.39ID:v0IxkFYT
>>362
それは手続き型言語の考え方
定義域、値域とかいいだしたら論理が循環する
365デフォルトの名無しさん
垢版 |
2024/10/18(金) 19:55:50.08ID:ndvmbteL
363が全然判ってなくて草
366デフォルトの名無しさん
垢版 |
2024/10/18(金) 21:19:37.07ID:6b0+FHXo
>>357
関数ポインタはあるじゃん
クロージャみたいに環境を持った関数は作れないけど
367デフォルトの名無しさん
垢版 |
2024/10/18(金) 21:27:21.74ID:Yil/SvXx
first class objectってのは、無名で扱える、関数の引数に渡せる、関数の返却値として返せる、を満たすものだよ
C言語の関数は必ず関数名を与えないといけないからfirst class objectではない

学部レベルの講義で独自理論なんか扱うわけない。>>338 で引用した説明が通説になっている
それを迂闊にも否定した >>339 は反省しろってことだな
2024/10/18(金) 21:33:52.38ID:v0IxkFYT
>>367
ラムダ算法をベースに考えた場合ファーストもくそもねーんだよ
全部関数
まじCSの教養ないぞお前
369デフォルトの名無しさん
垢版 |
2024/10/18(金) 22:19:50.60ID:VQpP6XIE
>>348
んでも、上で書いた通りOCamlやSMLも誇大広告してたし、さらに言えばJITコンパイラ出した当初のJavaやC#も似たような誇大広告してたんだけどね。
2024/10/18(金) 22:55:23.05ID:36/T9R8D
「関数型プログラミング」にも「第一級オブジェクト」にも言語の垣根を超えた一般的な定義というものはない
「オブジェクト指向」を自称する言語たちがそれぞれ微妙に異なるオブジェクトを実装しているのとほぼ同じ
2024/10/18(金) 23:00:20.33ID:36/T9R8D
てかどうでもいいけどfirst-class objectって英語圏ネイティブからするとどういう印象を受ける言葉なんだろうね
masterとかblacklistなんかとは比べ物にならないレベルで明確にpolitically incorrectな気がするけど
372デフォルトの名無しさん
垢版 |
2024/10/18(金) 23:10:22.32ID:Py1NdU9l
>>364
それは流石に関数に対する理解が浅いかと。

関数は要素と像のペアの集合なんだから、定義域と値域は関数に必ず存在する重要な性質だろ。
それを無視するのは関数の本質を無視するようなもの。

「定義域、値域とかいいだしたら論理が循環する」と言うなら、>338 に関連して定義域、値域よりも関数の定義に近い重要な性質って何よ?
373デフォルトの名無しさん
垢版 |
2024/10/18(金) 23:28:21.46ID:6b0+FHXo
理解不足かもしれないけど「『副作用の無い、単に写像として表現できる関数』を中心に組み立てる」くらいの認識じゃだめなの?
数学的な意味での定義域はプログラミングでは成り立たない気がする
引数の型がi32なら、その関数には32ビット整数の取り得る値すべてが入るわけだし
ゼロ除算は数学上は定義できないけど、プログラムとしては書けてしまうから「考慮しない」わけにはいかず、エラー処理が必要なわけで
2024/10/18(金) 23:35:59.34ID:cbeCWz4D
ガロア体の話?
2024/10/18(金) 23:56:20.42ID:US/DDn9d
モダンな関数型プログラミングのサポートもメモリ安全性も今では必須の前提になっている
そのうえでC言語と同等の速さと省メモリ性を兼ね備えたRustだけが核心部でも使われ生き残るのさ
2024/10/18(金) 23:59:05.04ID:x/LLoMNV
>>375
>そのうえでC言語と同等の速さと省メモリ性を兼ね備えたRust
ダウト
377デフォルトの名無しさん
垢版 |
2024/10/18(金) 23:59:21.56ID:6b0+FHXo
プログラミングの上ではある程度の割り切りはしてると思う
例えば「入力の文字列を2回繰り返した文字列を返す (例. ABC -> ABCABC) 」関数は、理想的には任意の文字列を渡せるけど、PCのメモリを食い尽くすほど長い文字列を与えたらプログラムが停止するよね
だからといって「この関数は純粋ではない」とは言わなくて、それでも実用上は関数として扱う、といったところはあると思う
378デフォルトの名無しさん
垢版 |
2024/10/19(土) 01:37:07.63ID:/2TSLe1L
>>373
大雑把に言えばそうだけど、Lisp系を関数型言語に含める人と含めない人(MLの系譜の言語だけが関数型言語)で意見が食い違って争いというか、Lisp系含めない人は比較的若い人が多いので、(関数型言語の条件にパターンマッチは必須じゃないなどと)訂正される。

若い人でも情報系の学校でLispを関数型言語って習うと思うが、世間一般に普及してるとは言い難い。
2024/10/19(土) 02:59:24.38ID:zdwsITl3
ぶっちゃけLispってもう年寄りしか使ってないよね
2024/10/19(土) 03:38:52.89ID:OaEQIxry
Lispは使うとか使わないとかじゃない
言語オタク度が一定のレベルに達すると常にそこにあることが見えるようになるものだ
2024/10/19(土) 05:03:40.93ID:pGZZ/Z6D
Erlangですねわかります
2024/10/19(土) 07:03:26.74ID:09S67de8
昨日リリースされたRust 1.82で、やっと Box<T>::new_uninit() が安定化された

これ、前にトラブってた、bindgenにC++のコンストラクタを作らせるとデータが壊れる件の解決策になるやん!
と思って、喜び勇んでbindgenのリポジトリ見に行ったら、特に対応予定はないみたいだった
2024/10/19(土) 10:54:30.72ID:3T8uATjn
Erlang の OTP に相当するのって Rust では何?
2024/10/19(土) 13:15:37.02ID:ZlmyUR62
>>383
OTP は役割が広すぎる。
どういうことを期待して「相当」と言ってるのかもうちょっとくわしく。
2024/10/19(土) 15:16:05.33ID:914NuxWA
>>383
tokio
2024/10/19(土) 16:54:27.33ID:zdwsITl3
今ってtokio一人勝ちってことでいいの?
他のランタイムに勝ち目ある?

tauriはtokioだけど、一応抽象化して直接見えないようにしてる努力は感じられた
でも実際にtokio以外を混ぜたらどうなるのかな? バグるなら抽象化した意味がないが
2024/10/19(土) 19:34:22.94ID:/3C3bE8g
>>372
定義域とか値域とか言い出してるあたりCS修めてない匂いプンプンするけど
百歩譲ってお前が言ってるのは型理論の範疇
型無の関数型がありえる以上関数型の定義とは直接関係ない
2024/10/19(土) 20:35:05.03ID:11v9Pc45
>型無の関数型がありえる以上

ちょっと待って、それって「関数型」の定義が与えられてなけりゃ言えないことでしょ。
2024/10/19(土) 22:16:54.49ID:/3C3bE8g
関数型言語
390デフォルトの名無しさん
垢版 |
2024/10/20(日) 02:22:08.35ID:IoIIyUOe
>>387
「関数」と「関数型」をごっちゃにしていない?
一連の話は「関数」の話で「関数型」じゃないよ.

そもそも「関数型」が一級オブジェクトの言語って存在するっけ?
391デフォルトの名無しさん
垢版 |
2024/10/20(日) 07:51:49.41ID:Rpp5gjxc
横からだが、全ての関数型言語は関数型も一級オブジェクトだよ。
意味が無いから無いだけで、map関数の逆バージョン(関数と値の立場逆転)も作れる。

pam _ [] = []
pam x (f:fs) = f x:pam x fs

pam 1 [(+1), (+2), (+3)] = [2,3,4]
392デフォルトの名無しさん
垢版 |
2024/10/20(日) 08:53:33.20ID:vZg//j7Z
そうなのよね。CS振りかざして偉そうにしてるヤツは単に分かってないだけで的外れ
393デフォルトの名無しさん
垢版 |
2024/10/20(日) 09:40:05.16ID:IoIIyUOe
>>391
関数型自体をオブジェクトにして保存したり実行時解釈したりってできたっけ?
Rustならジェネリック関数の型引数を変数に保存して使うイメージ.
C++ならテンプレート関数のテンプレート引数を変数にして実行時解釈する感じ.

スクリプト言語とかならできるかな?
Rubyはできた気がする.Pythonはどうだったっけ?
JavaScriptはプロトタイプチェーンだからできるか.JavaScriptのプロトタイプオブジェクトを型と言って良いのか微妙だけど.
2024/10/20(日) 09:41:59.72ID:N14K/WsC
>>286
言語は関係なしにプログラマが優秀なだけだろ
2024/10/20(日) 10:01:17.80ID:KK2kuO2o
>>391
その例は単に関数がfirst classというだけじゃん

Idrisとかなら関数の型を受け取って別の関数の型を生成して返すような関数が作れるので関数の型もfirst classと言える
396デフォルトの名無しさん
垢版 |
2024/10/20(日) 10:37:31.29ID:LzrvAVJD
歯透ける厨と同じ臭いがプンプンする
2024/10/20(日) 13:32:41.76ID:AQmfmnaz

どこからか「関数型」が指すのがfunctionalからfunction typeにすり替わってないか
2024/10/20(日) 14:28:18.13ID:xF+HnWMo
すり替わってるわけではない
>>390の最後の行から違う定義の話に逸れただけ
おかけで関数型を理解してない人が炙り出されて結果オーライ
399デフォルトの名無しさん
垢版 |
2024/10/20(日) 14:45:25.09ID:Rpp5gjxc
>>393
関数型言語はオブジェクト指向じゃないのでオブジェクトは無いが…。
(OCamlならやCommon-Lispならオブジェクト指向もサポートしてるので、出来るかもしれないが)

というか、「全ての関数型言語は」と書いたのに、あなたの出す言語に一個も関数型言語は入ってないのだが…。

普通にできるジェネリック関数とか区別せずに、全ての関数でできる。

f = (+1)
g = print
h = g.f
h 1 =
2
と出力

mapM_ h [1..3] =
2
3
4
と出力

sequence_ [h 1, h 2, h 3] =
mapM_の時と同じ結果

(sequence_.tail) [h 1, h 2, h 3] =
3
4
と出力
400デフォルトの名無しさん
垢版 |
2024/10/20(日) 14:51:20.54ID:Rpp5gjxc
あ、Haskell意外だと副作用のある関数の扱いは分からんが、普通の関数なら全ての関数型言語はできる。
むしろ、それがFP(関数プログラミング)で提唱されていること。
2024/10/20(日) 17:34:13.10ID:xPa/dMaC
そして誰もツッコミすらしなくなった・・・
402デフォルトの名無しさん
垢版 |
2024/10/20(日) 17:43:19.05ID:IoIIyUOe
>>398
「関数型」言い始めたのはその前の>387からだろ.
>390はその流れを受けているだけ.

>>393
もともとの話が>338(1,2,が同じことを言っているのか別のことを言っているのか)の話なんだから,その文脈での"Object"だよ.
とりあえずWikipediaの「第一級オブジェクト」あたりを下敷きにすればいいんじゃね?
ja.wikipedia.org/wiki/%E7%AC%AC%E4%B8%80%E7%B4%

> 普通にできるジェネリック関数とか区別せずに、全ての関数でできる。
ということだけど,Haskellとかの関数型言語って,mapとかの高階関数そのものを引数にしたり戻り値にしたりできたっけ?
2024/10/20(日) 17:45:10.88ID:PyTRrFhl
そろそろRustの話しろよ
2024/10/20(日) 17:58:45.35ID:2ZyMYwfA
>ということだけど,Haskellとかの関数型言語って,mapとかの高階関数そのものを引数にしたり戻り値にしたりできたっけ?
そらできるだろ
逆に関数がファーストクラスの言語でできないやつあるの?
2024/10/20(日) 18:04:59.62ID:jAtz6juv
そもそもスレチで鮨
https://srad.jp/comment/135132
2024/10/20(日) 18:07:49.61ID:gkezQsQG
>>402
>>387の言ってる関数型はfunction typeじゃなくてfunctional programming (languages)でしょ
「型無の関数型(言語)」の意味が通じてなさそうだからわざわざ言い直してるんじゃない?
407デフォルトの名無しさん
垢版 |
2024/10/20(日) 18:16:41.15ID:Rpp5gjxc
>>402
高階関数そのものを?
普通にできる。

f mf f xs = mf f xs

f map (+1) [1..3] = [2,3,4]
408デフォルトの名無しさん
垢版 |
2024/10/20(日) 18:20:10.46ID:IoIIyUOe
>>406
もともとの話が>338(1,2,が同じことを言っているのか別のことを言っているのか)の話なんだから,その文脈での"関数"だよ.

> 「型無の関数型(言語)」の意味が通じてなさそうだからわざわざ言い直してるんじゃない?
「意味が通じてなさそう」とか言われても,「型無の関数型」自体が>387初出だから.>372に対してではなく自分に対して言い直しているのかしらん?

>407
できるのね.ありがとう.
そろそろ苦情が出てるしレスやめるわ.
409デフォルトの名無しさん
垢版 |
2024/10/20(日) 18:26:43.67ID:Rpp5gjxc
カリー化してxsを見た目上消すのは関数を返すとみなせる。

f mf f = mf f
410デフォルトの名無しさん
垢版 |
2024/10/20(日) 18:27:17.94ID:Rpp5gjxc
あいよ
2024/10/20(日) 18:37:12.50ID:+u+XD+zR
実現方法はキャプチャしたクロージャとかでもいいんだろ
他にも構造体とそれ用のメソッドを用意する形でも実現できる
関数という名に囚われて関数自体を返さなければいけないわけではない
2024/10/20(日) 23:14:31.47ID:Bo7WX30F
>>406
そりゃねえ、関数型言語の定義の議論をしているところにいきなり「型無の関数型(言語)がありえる」なんてのを
根拠に持ち出したら意味が通じないわ。
2024/10/21(月) 09:54:32.14ID:WDt/GORo
もう病気の類なんじゃないのかなこの人は
アスペを認めるとザワザワして発狂してしまうの?
2024/10/21(月) 14:02:30.37ID:n20TdxL4
>>392
話の流れは追ってないけど、東大文系学科中退のホリエモン、
(もともと所属学科が存在しない)ハーバード大で法律と数学
の単位を取って中退したビルゲイツと、Fラン大学でcs学科
専攻した人を比較するのはおかしいと思うな。
2024/10/21(月) 22:09:07.40ID:SnMtmJ3l
>>378
パターンマッチ有り無しとか些末すぎる
lispマクロがなぜ強力なのかを理論的に説明できないやつは関数型言語が何かを理解できてない
2024/10/21(月) 22:49:21.88ID:/PsiTyLC
>>415
Lispのマクロは健全なマクロ(hygienic macro)ではない
2024/10/21(月) 23:05:26.66ID:hCFqhCaa
>>415
Lispではコードもデータも全部同じS式なので
S式で書かれたコード片をそのままデータとして扱えるから
というのがLispのマクロが強力な最大の理由

でもこれは関数型の話とはあまり関係と思う
418デフォルトの名無しさん
垢版 |
2024/10/22(火) 00:53:30.71ID:OQZ/hYZy
>>415
lispマクロと関数型言語は関係なくね?
2024/10/22(火) 02:07:57.31ID:auCI67yl
>>417
それがあのシンプルな言語仕様で実現できるのはラムダ計算を計算モデルに持つから
それが関数型言語のパワーを端的に表している
420デフォルトの名無しさん
垢版 |
2024/10/22(火) 06:02:08.36ID:rwk9TcPR
>>415
lispマクロってCommon-Lispのマクロだよね?
SchemeやarcなどLisp系にも色々あるのに、Common-LispがいかにもLisp全体であるかのように言わないでいただきたい。
421デフォルトの名無しさん
垢版 |
2024/10/22(火) 21:51:40.07ID:f0BQn25L
ここはLispスレ?
2024/10/22(火) 21:54:55.10ID:I9yNs4FT
はい、そうです
2024/10/22(火) 21:59:52.45ID:nxkbQsPd
>>416
その点Rustは健全なマクロ(衛生的なマクロ)だから優れてるな
2024/10/22(火) 22:50:58.38ID:yMGUdyDA
>>419
ラムダ計算をベースとしてるのはLispに限った話じゃないので
Lispのマクロが他に比べて強力な理由にはならないよね?
2024/10/22(火) 23:33:18.43ID:yd5fGGcj
ラムダ計算が計算モデルに持つとは、例えば自然数やcons cellなどの値がすべてチャーチエンコーディング等の手法を利用してラムダ項による表現を持つという意味でしょうか
不可能ではないかもしれませんが、esolang以外ではあまり聞きませんな
2024/10/23(水) 00:17:49.94ID:+ikzunZs
型無しのラムダ計算だと
|f| f(f)
で自分に自分を渡すみたいな気持ち悪い事ができるけど
一般的な関数型言語の型付きラムダ計算だと無理なんだよね

macro_rules! combinator { ($f:expr) => { ($f)($f) }; }
とかしてもコンパイルできるcombinator!(f)が存在しないはず
何か裏技あるかもしれないけど
2024/10/23(水) 00:50:41.84ID:uXSdyuX/
>>426
https://play.rust-lang.org/?version=stable&mode=debug&edition=2021&gist=4e875602eb434b87811e7f8043069df1

別に裏技っぽいことは何もいらないが……
2024/10/23(水) 00:54:14.76ID:XMcvf1I0
>>423
健全なマクロは健全にしか出来ないんだよ。
意図的に衝突させるという自由は奪われる。
普通にしてたら健全なマクロになりつつ必要なときにはそうじゃない選択もあって欲しい。
健全なマクロが優れているということはない。
状況による。
2024/10/23(水) 01:19:20.88ID:wus7H+cg
>>428
常に健全なマクロが優秀
https://ja.wikipedia.org/wiki/%E5%81%A5%E5%85%A8%E3%81%AA%E3%83%9E%E3%82%AF%E3%83%AD
2024/10/23(水) 08:51:56.69ID:4l11/KhE
>>429
そういうなら根拠を提示しなよ
2024/10/23(水) 09:46:54.15ID:reDRncMZ
まあ「コーダーのミスを許さない」というRustのコンセプト的には、余計な束縛をしない健全マクロのほうがビックリネタ減るわな。
2024/10/23(水) 12:28:40.45ID:wus7H+cg
>>430
健全なマクロが優秀である根拠は>>429で示した
2024/10/23(水) 12:55:59.93ID:E1QNIy5A
>>427
macro_rules! combinator { ($f:expr) => { ($f)($f) }; }

macro_rules! combinator { ($f:expr) => { (($f)($f)) }; }
にしないと抜け道があるなw
これだからマクロは苦手
2024/10/23(水) 13:44:18.19ID:uXSdyuX/
>>433
変えても何も変わらないし、関係ない
マクロで定義してるこのcombinatorを関数にして型を付けようとすると、Haskellで言うRank2Types拡張相当のリッチな型が必要で、それは必ずしも「一般的な関数型言語の型」ではないという話なら分かる
435デフォルトの名無しさん
垢版 |
2024/10/23(水) 14:16:45.58ID:CetgrrtL
>>423
proc_macro2 は
2024/10/23(水) 15:08:29.40ID:XMcvf1I0
>>432
書かれてないぞ。
どの部分のことを言ってる?
437デフォルトの名無しさん
垢版 |
2024/10/23(水) 15:49:07.30ID:CetgrrtL
お前らなんか作ってんの?
2024/10/23(水) 18:08:14.82ID:XMcvf1I0
身バレするから詳しいことは言えないんだ。
匿名前提のコミュニティの制約だからしょうがない
2024/10/23(水) 20:22:42.34ID:cjlpqfP+
>>428
Rustのmacro_rulesで宣言されるマクロは健全なマクロだけど
敢えてローカルスコープでマクロ宣言すれば不健全にローカル変数をそのまま使えるため両対応しているよ

>>435
手続きマクロは解析木を入力に自在だね
2024/10/23(水) 22:12:20.50ID:IFkNXH06
>>426
untypedのラムダ計算をベースにしてる言語は
Lispだけでも関数型の言語だけでもないよね

>>415で言ってたLispのマクロが強力さっていうのは
Lisp特有の話じゃなかったってことでいいのかな?
だとしたら俺の考える強力さとは違ってた
2024/10/24(木) 07:52:11.99ID:ZozkKVrc
>>440
ASTを生成するコードを作れるのは大抵強力だろ。
全然別のアプローチとしてFORTHのIMMEDIATE POSTPONEみたいなのもあるけど。
2024/10/24(木) 10:38:00.79ID:nzvp2PCa
>>441
>ASTを生成するコードを作れる
若干意味が曖昧だけどASTをいじれれば強力ということなら
それはLispに限らないし関数型言語にも限らないので
関数型言語や関数型の定義との関連は薄い
2024/10/24(木) 10:45:57.96ID:EC4ipT+P
Rustは、ASTを使ったマクロが書けるということみたいですが、
それについて詳しい書籍は有りませんか?
2024/10/24(木) 11:20:06.71ID:Izj+Eszj
AST操作ができるという意味では、Lispマクロと同等の能力を持つマクロを持つ言語は他にもあれど
AST自体がS式で非常に簡潔だからマクロを書くために追加で学習する事項はほとんどないし、言語実装側もかんたん、というのがLispマクロの特色と言えるかもね
2024/10/24(木) 11:46:01.90ID:oHvtQW/4
>>443
本は知らんけどネットの情報だけで充分に学習出来た(経験談)
2024/10/24(木) 12:02:07.13ID:nzvp2PCa
>>443
本じゃないけどdtolnayのprocedural macros workshop
本ならManningのマクロ本
2024/10/24(木) 14:32:18.09ID:dQJ9Pscb
>>442
だからそういうことでしょ。

マクロは関数型言語・関数型プログラミングと直接関係無いし、Lispマクロが強力なのはASTを直接操作するメタプログラミングだからであって関数~~と直接関係無い。
2024/10/24(木) 16:46:48.00ID:zniBHQh+
昔CommonLispでゲームサーバーとか作ってたけどね。マクロ書くのが楽なのは良かったね。
どちらかというと稼働中なサーバー止めずに関数単位でビルドできるとか型を指定して最適化しやすいってのがいい所だったけど真っ当なlispはAllegro Commom Lisp ぐらいしかないし、高くて勧められない。
今はもうrustの方が圧倒的に便利だし、マクロも必要十分と思ってる。s式だけに拘る理由はないよ。
2024/10/24(木) 17:02:46.99ID:zniBHQh+
マクロで抽象度高めるのはいいけど、やりすぎると自分以外に分からないDSLになる。程々でいいのよ。
Rustは頑張ればなんでも書けるマクロがあるけど、クレート分けたりちょっと面倒なんで程々で収まる。素人が手を出さない。ライブラリ作るような人だけ頑張ればいいの。
450デフォルトの名無しさん
垢版 |
2024/10/24(木) 17:49:54.17ID:H1OVOnXq
乱数が標準ライブラリーで使えないなんて言語ある?
2024/10/24(木) 18:03:21.93ID:Vyb04yis
>>450
RandomStateが標準ライブラリにある
用途が極少数ならそのまま使ってもよい
用途が多数なら枯渇するためシードとして用いる
シードからの生成アルゴリズムはその性質に応じて無数にあるため標準ライブラリの対象外
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

ニューススポーツなんでも実況