制御構文が式だとどんなメリットがありますか?
■ このスレッドは過去ログ倉庫に格納されています
0001名無しさん@お腹いっぱい。
NGNGどのようなメリットがあるんでしょうか?
どっちでも良さそうなんですが、実際の所どうでしょうか?
それと、制御構文が式の言語って何がありますか?
0002名無しさん@お腹いっぱい。
NGNGたとえばifをCの三項演算子のようにつかえる
(display (if x "hello" "bye"))
みたいな。
0003名無しさん@お腹いっぱい。
NGNG大概の言語にテクニックとかいってあるんじゃないの。
"?"みたいなのってどこでも盲腸みたいなもんじゃん。
0004名無しさん@お腹いっぱい。
NGNGtypedef void (*FuncType)();
IF( BOOL b@` FuncType trueFunc@` FuncType falseFunc )
とか作ればいいんだよ。
0005名無しさん@お腹いっぱい。
NGNGそれじゃIFに値がないじゃん。
0006むぎ茶
NGNG呼び出されちゃいませんか?
0007>6
NGNG0008名無しさん@お腹いっぱい。
NGNG無名関数を使えるならまだしも。
つーか、制御構造を関数にするのに反対してるわけじゃないか。
#gccは複合文も値を返せて、Lispちっく。
0009名無しさん@お腹いっぱい。
NGNG複合文が値を返せて、なにが変わるの?
4の意味は判りましたが、だからなに?って感じなんですが。
そうゆう言語を使ったことが無いので興味があります。
誰かわかりやすく説明してください。
0010名無しさん@@
NGNGマルチスレッドの場合、変数にアクセスすれば
排他制御がいるし、今時のCPUでは内部の回路が
並列動作するんでオプチマイズに有利。
ただ、Lispは研究材料だから、
実際にLispをつかえばどうのこうの
というわけではない。
0011名無しさん@お腹いっぱい。
NGNGふむぅ、つまりプログラマーが幸せになれるわけではないのね
0012名前ついてますか?
NGNGそれをつかって簡潔に書けて幸せだ、と思ったことない? >>9
|| や && も shortcutするのでその範疇だな。
複合文が値を返せると、複雑なマクロを書くとき便利。
#define max(x@`y) ({int _x = (x)@` _y = (y); _x >= _y ? _x : _y;})
参照透過性は代入文とかそのなかで使ったら簡単に崩れちゃうんで
別問題でしょう。 >>10
0013名無しさん@お腹いっぱい。
NGNGそのmaxはなんか無理矢理な気がして例として好きになれない。
普通はMAXをそうは書かないだろ。
それと、複合文が値を返すことの利点がマクロに限るのであれば、
インライン関数/関数テンプレートが使えれば良いだけの話に
ならないか。
要するにC++では何も嬉しくないってことで良いのだな。
00149
NGNGなるほど。
では、構文ifが式になったのが?だとして
for@`whileは、どうなるんでしょう?
繰り返しに値はないと思うのですが・・・
バカですいません。
0015名無しさん@お腹いっぱい。
NGNG繰り返しは再帰にする
0016名前ついてますか?
NGNG他の例は自分で考えてね♪
00179
NGNGそんなの、スタックいっぱいになって使い物・・・
いや、そーじゃなくて、構文が式になったらどう便利なのかが
知りたいのですが。
私の読解力がたりませんか?
00189
NGNG>>15でした
0019名無しさん@お腹いっぱい。
NGNGコンパイラ作る側としては楽になるかも〜
stmt:expression
|while_stmt
|if_stmt
とか書かなくて済むから。
expression:lval '=' term
|lval if '(' logical_expr ')' ...
とか増えて結局規則数はいっしょか…
でも、すごく透過性がいいし、
if文とかも多重定義できるようになるかも。
あ、リフレクション使えばいいのか(笑)
00209
NGNG>if文とかも多重定義できるようになるかも。
おぉ、それは幸せになれそうな予感!
それは是非実装したものが欲しいですねー。
0021名無しさん@お腹いっぱい。
NGNGThunkコードとか言うのにして
と、有澤誠がbitで書いていたような気もしたけども20年以上前の
話だしなあ
00229
NGNGリフレクションと言う言葉が初耳だったので、ちょっと
色々調べ回ってみました。
概念として面白いですね。実装できてるのはJAVAだけかな?
しかし、だからなに?ってところが、まだどうもしっくりこない
ですけど。まぁ、私の浅学のせいですが。
まぁ、わたしはプログラマーですから、どうしても
だから何ができるの、ってところが気になるんですよね。
それはさておき、この話は終わりそうにないので、このへんで。
002319
NGNG筑波大のOpenC++がありまっせ。
使ったことはないけどDLできます。
バックエンドにgccとかvc++を使うみたいだけど、
C++から静的にリフレクションできます。
例えば、
「コンストラクタが呼ばれたら全てのクラスのオブジェクトはメンバ変数の中身を二次記憶に探しに行け!」
「デストラクタが呼ばれたら全てのクラスのオブジェクトはメンバ変数の中身を二次記憶にかき出せ!」
というような記述もできます。継承とかと違って、全然関係ないクラスにも適用できるのが吉。
0024名前ついてますか?
NGNGスタック使わないよ。って、そこまで C programmerに要請するのも酷か。
ちなみに tail recursionってのは、
return func(args...);
って式で終わる再帰関数。
普通の再帰はスタックフレームの上にさらにフレームをつんでどんどんメモリ
食うけど、末尾再帰だと今使ってるフレームをそのまま次の呼び出しの
フレームに使えるのでスタックが伸びないのです。
もちろん optimizeしてくれる compilerだとだけど。
C compilerでそういう optimizeしてくれるのは知らない。
schemeの世界だと常識。っていうか仕様。
0025名前ついてますか?
NGNG(common lisp object system) でしょう。って俺も
お勉強しかしたことないけど。
あと Smalltalk80の MetaClassとかも reflectionっぽいけど。
0026虹
NGNGなので、例えば
str=case n
when 1
"FIRST"
when 2
"SECOND"
when 3
"THIRD"
else
"OVER"
end
みたいな書き方ができます。あんま使わないけど、まあできないよりは
できた方が嬉しいかな。
0027名無しさん@お腹いっぱい。
NGNGMC++(実装入手できんのかなあ
0028ぎこるび
NGNGメソッドの戻り値が最後の式の値なので、制御構文を最後におくことは良くしますー。
明示的に return した方が可読性は高いですけどね。
def foo(bar)
case bar
when String
"文字列だよ"
when Numeric
"数値です"
when Regexp
"正規表現だったり"
else
"なんかよくしらない"
end
end
printf "%s %s %s %s\n"@` foo("1")@` foo(1)@` foo(/1/)@` foo(0..0)
#=>文字列だよ 数値です 正規表現だったり なんかよくしらない
■ このスレッドは過去ログ倉庫に格納されています