トップページ⇒tech
28コメント11KB

制御構文が式だとどんなメリットがありますか?

■ このスレッドは過去ログ倉庫に格納されています
0001名無しさん@お腹いっぱい。NGNG
制御構文(if@`while@`for)が文ではなくて式の場合は
どのようなメリットがあるんでしょうか?
どっちでも良さそうなんですが、実際の所どうでしょうか?

それと、制御構文が式の言語って何がありますか?
0002名無しさん@お腹いっぱい。NGNG
lisp/scheme
たとえばifをCの三項演算子のようにつかえる
(display (if x "hello" "bye"))
みたいな。
0003名無しさん@お腹いっぱい。NGNG
excelのVBAってこと?(VBにもなんかあったっけ?)
大概の言語にテクニックとかいってあるんじゃないの。
"?"みたいなのってどこでも盲腸みたいなもんじゃん。
0004名無しさん@お腹いっぱい。NGNG
Cだって
typedef void (*FuncType)();
IF( BOOL b@` FuncType trueFunc@` FuncType falseFunc )
とか作ればいいんだよ。
0005名無しさん@お腹いっぱい。NGNG
>>4
それじゃIFに値がないじゃん。
0006むぎ茶NGNG
関数にすると条件節、Then節、Else節 が評価された後 if が
呼び出されちゃいませんか?
0007>6NGNG
関数を渡してるんじゃなくて関数ポインタを渡せば
0008名無しさん@お腹いっぱい。NGNG
>>7 いちいち関数を定義するの面倒やん。
無名関数を使えるならまだしも。

つーか、制御構造を関数にするのに反対してるわけじゃないか。

#gccは複合文も値を返せて、Lispちっく。
0009名無しさん@お腹いっぱい。NGNG
制御構文が値を持って、どう幸せになれるの?
複合文が値を返せて、なにが変わるの?
4の意味は判りましたが、だからなに?って感じなんですが。
そうゆう言語を使ったことが無いので興味があります。
誰かわかりやすく説明してください。
0010名無しさん@@NGNG
参照透過性が高まる。
マルチスレッドの場合、変数にアクセスすれば
排他制御がいるし、今時のCPUでは内部の回路が
並列動作するんでオプチマイズに有利。
ただ、Lispは研究材料だから、
実際にLispをつかえばどうのこうの
というわけではない。
0011名無しさん@お腹いっぱい。NGNG
>>10
ふむぅ、つまりプログラマーが幸せになれるわけではないのね
0012名前ついてますか?NGNG
っていうか、Cにすでにある三項演算子なんか制御式?の実例ですけど、
それをつかって簡潔に書けて幸せだ、と思ったことない? >>9
|| や && も shortcutするのでその範疇だな。
複合文が値を返せると、複雑なマクロを書くとき便利。
#define max(x@`y) ({int _x = (x)@` _y = (y); _x >= _y ? _x : _y;})

参照透過性は代入文とかそのなかで使ったら簡単に崩れちゃうんで
別問題でしょう。 >>10
0013名無しさん@お腹いっぱい。NGNG
>>12
そのmaxはなんか無理矢理な気がして例として好きになれない。
普通はMAXをそうは書かないだろ。
それと、複合文が値を返すことの利点がマクロに限るのであれば、
インライン関数/関数テンプレートが使えれば良いだけの話に
ならないか。
要するにC++では何も嬉しくないってことで良いのだな。
00149NGNG
>>12
なるほど。
では、構文ifが式になったのが?だとして
for@`whileは、どうなるんでしょう?
繰り返しに値はないと思うのですが・・・
バカですいません。
0015名無しさん@お腹いっぱい。NGNG
>>14
繰り返しは再帰にする
0016名前ついてますか?NGNG
>>13 勝手にマクロに限っちゃいや!
他の例は自分で考えてね♪
00179NGNG
>>14
そんなの、スタックいっぱいになって使い物・・・
いや、そーじゃなくて、構文が式になったらどう便利なのかが
知りたいのですが。
私の読解力がたりませんか?
00189NGNG
リンク間違い
>>15でした
0019名無しさん@お腹いっぱい。NGNG
>17

コンパイラ作る側としては楽になるかも〜

stmt:expression
|while_stmt
|if_stmt

とか書かなくて済むから。

expression:lval '=' term
|lval if '(' logical_expr ')' ...

とか増えて結局規則数はいっしょか…
でも、すごく透過性がいいし、
if文とかも多重定義できるようになるかも。
あ、リフレクション使えばいいのか(笑)
00209NGNG
>>19
>if文とかも多重定義できるようになるかも。
おぉ、それは幸せになれそうな予感!
それは是非実装したものが欲しいですねー。
0021名無しさん@お腹いっぱい。NGNG
Algol68だと制御構文ごと関数の引数に書けませんでしたっけ
Thunkコードとか言うのにして
と、有澤誠がbitで書いていたような気もしたけども20年以上前の
話だしなあ
00229NGNG
>>19
リフレクションと言う言葉が初耳だったので、ちょっと
色々調べ回ってみました。
概念として面白いですね。実装できてるのはJAVAだけかな?
しかし、だからなに?ってところが、まだどうもしっくりこない
ですけど。まぁ、私の浅学のせいですが。

まぁ、わたしはプログラマーですから、どうしても
だから何ができるの、ってところが気になるんですよね。

それはさておき、この話は終わりそうにないので、このへんで。
002319NGNG
>9

筑波大のOpenC++がありまっせ。
使ったことはないけどDLできます。
バックエンドにgccとかvc++を使うみたいだけど、
C++から静的にリフレクションできます。
例えば、
「コンストラクタが呼ばれたら全てのクラスのオブジェクトはメンバ変数の中身を二次記憶に探しに行け!」
「デストラクタが呼ばれたら全てのクラスのオブジェクトはメンバ変数の中身を二次記憶にかき出せ!」
というような記述もできます。継承とかと違って、全然関係ないクラスにも適用できるのが吉。
0024名前ついてますか?NGNG
>>7 tail recursionになるように書けば (& compilerが optimizeしてくれれば)
スタック使わないよ。って、そこまで C programmerに要請するのも酷か。

ちなみに tail recursionってのは、
return func(args...);
って式で終わる再帰関数。
普通の再帰はスタックフレームの上にさらにフレームをつんでどんどんメモリ
食うけど、末尾再帰だと今使ってるフレームをそのまま次の呼び出しの
フレームに使えるのでスタックが伸びないのです。
もちろん optimizeしてくれる compilerだとだけど。
C compilerでそういう optimizeしてくれるのは知らない。
schemeの世界だと常識。っていうか仕様。
0025名前ついてますか?NGNG
>>22 reflectionといえばなんといっても CLOS
(common lisp object system) でしょう。って俺も
お勉強しかしたことないけど。
あと Smalltalk80の MetaClassとかも reflectionっぽいけど。
0026虹NGNG
まだ出てないけど、Rubyもほとんど(全て?)の制御構文が値を持ちます。
なので、例えば
str=case n
when 1
"FIRST"
when 2
"SECOND"
when 3
"THIRD"
else
"OVER"
end
みたいな書き方ができます。あんま使わないけど、まあできないよりは
できた方が嬉しいかな。
0027名無しさん@お腹いっぱい。NGNG
>>22
MC++(実装入手できんのかなあ
0028ぎこるびNGNG
>>26
メソッドの戻り値が最後の式の値なので、制御構文を最後におくことは良くしますー。
明示的に 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)
#=>文字列だよ 数値です 正規表現だったり なんかよくしらない
■ このスレッドは過去ログ倉庫に格納されています