C/C++でのevalの実現方法について
発端
C言語でevalやろうとしたら、マクロ使うしかないかな…やっぱり。連番とか似た名前の変数をまとめて処理したいことがけっこうある。 いや、最初から配列とか構造体とかにしておけという説はもちろんなんだけど。ねぇ…
2016-09-29 20:33:37案1:自作
@aokomoriuta え?本当ですか? 完全に独立させていいなら電卓みたいにできるかもしれませんが。 geocities.jp/m_hiroi/linux/… 既存変数を維持したままをマクロ以外でできます?少なくとも簡単ではないのでは… スクリプト系言語なら,既存の変数でもできますが…
2016-09-29 22:35:29@senopen 今はありがたいことにフロントエンドはclangが使えるのでそれに喰わせて、あとはLLVMバックエンド作ればちょろいですね!!!!
2016-09-29 22:39:22@aokomoriuta いや,それは全然ちょろくないのでは(苦笑) 不本意ですが,素直にマクロで片付けますかね… アレ(TeX)を想起させるマクロはできれば使いたくないのですけど,止むを得ません。
2016-09-29 22:46:54@aokomoriuta いや,ごもっともです… ただ,ちょっとうまくやりたいだけなんですよね。そこだけでしか必要でありませんし,わざわざ設計をみなすまではしたくない… それか,その場しのぎとして諦めてベタ書きにしてしまいますかね… 後の保守性とか,きれいさとかなくなりますけど…
2016-09-29 23:14:06@aokomoriuta boost.preprocessorとかですか?boostは標準でないので、使えないことがあるのがネックです…。 頭に留めておいてまた調べてみます。
2016-09-30 08:50:09@senopen boostを「使えないことがあるレベル」と言うなら、標準ライブラリですら整備されていない処理系を想定してるってことですね。それは大変そう。
2016-09-30 08:53:35@aokomoriuta #include <boost/boost.preprocessor>を書いたcppファイルを、昨晩自宅のUbuntu 16.04 g++ 5.4でコンパイルしたら見つかりませんとでたので、あることを前提にできないなと思いました。
2016-09-30 09:01:07@aokomoriuta たしかそうだったと思います。さっきは曖昧な記憶で書き間違えました。念のため今晩帰宅後再確認します。 古いコードを触っているので、新ライブラリ導入するのはなんか気が引けてしまいます。そこまでいくとやり過ぎかなと。 おとなしくベタガキで対処します…
2016-09-30 09:08:11やっぱりUbuntu16.04標準ではboostライブラリはない。 そして,インストールしようとしたら,ビルドが必要で,ダウンロードしただけじゃだめ…やっぱり面倒だな。boostにはあまり頼らないほうがいいか。 boostjp.github.io/howtobuild.html @senopen
2016-10-01 15:12:18案2:外部ファイルに出力
はい / C++ で eval() - 偏見プログラマの語り! - pg-kura.hatenablog.com/entry/20110926… twitter.com/senopen/status…
2016-09-29 23:12:55@pink_bangbi ありがとうございます。 しかし,これじゃない感が… C/C++でやろうとしたら,こんな感じの方法しかないのですかね… そもそもC/C++でevalやろうとする時点で負けですかね… 落ち着いたら時間をかけて方法を検討してみます。
2016-09-29 23:18:11@senopen そもそも eval() を使ってどのようなことをしたいのか、で手段が違ってくると思います。例えば連番の変数を定義したいのか、それとも動的に C++ のコードを実行できるようにしたいのか etc...
2016-09-29 23:25:07@pink_bangbi イメージとしては, b_1=func(a_1); b_2=func(a_2); b_3=func(a_3); みたいな感じです。連番や似たような名前の変数を処理したいだけです。
2016-09-29 23:27:06@senopen で、あれば eval() みたいなものではなくてマクロを使うのが C/C++ に置いてベターだと思います。
2016-09-29 23:28:21@pink_bangbi まあ,そうなりますよね… シェルスクリプトだと, for i in 1 2 3 do eval "b_$i=func(a_$i)" done で簡単にできるので,こんな感じでC/C++でもやる方法ないかなと思った次第でした。どうもありがとうございました。
2016-09-29 23:30:49