どの言語でもいいのですが、
変数内にロジックを記載してそれを実行って可能でしょうか?
String a = "1 + 3"
aを実行
結果 4
みたいな
※上のString云々はあくまで例です
※変数内にロジックを定義して、それをプログラムとして実行可能な言語が存在するか?という質問です
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/05/23 04:36 編集
2018/05/23 04:50
回答12件
0
投稿2018/05/23 04:38
総合スコア5572
0
ベストアンサー
スクリプト言語ではeval
といって、文字列から実行を行う仕組みが内蔵されている例が多々あります。
ただし、文字列からコードを実行すると、
- 文法的なエラーも実行時までわからない
- 外部から文字列を流し込めると、本来実行させるつもりのないことまで実行させられてしまう
- 速度が出ない
など多々問題がありますので、よほどの理由がない限り避ける、というのが常識のようになっています。
投稿2018/05/23 04:38
編集2018/05/23 04:40総合スコア145183
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
lisp について調査してみるとよいです。
リストの評価
http://wisdom.sakura.ne.jp/programming/lisp/clisp7.html
...
LISP 言語の多くの処理を実行時に動的に決定させることができるという可能性を表しています。 関数 (+ 10 20) や (set 'x 10) などの関数を実行するコマンドがすべてリストであるということは、これらを変数として保存することができるということを意味します。(+ 10 20) を LISP システムに渡すと、システムはこのリストを評価して、その結果を表示していたのです。 list 関数や setq 特別式で作成したリストは、LISP に渡されたわけではなく、この関数が実行され、その結果が表示されていたのです。
では、リストを実行することができるのだろうか?という疑問が湧き上がってくるはずです。 LISP には組み込み関数でリストを評価する eval 関数があります。
...
投稿2018/05/23 12:41
総合スコア22324
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
配列にロジックを収めて、順に実行(結果出力)しています。
swift
1let funcs: [() -> Any] = [ 2 {return 1 + 3}, 3 {return "hogehoge".replacingOccurrences(of: "o", with: "a")}, 4 {return sin(30 * Double.pi / 180)}, 5] 6for f in funcs { 7 let result = f() 8 print("(result) ((type(of: result)))") 9} 10//=> 4 (Int) 11//=> hagehage (String) 12//=> 0.5 (Double)
変数に代入してから実行も出来ます。
swift
1let a = funcs[1] 2print(a()) 3//=> hagehage
投稿2018/05/23 05:23
編集2018/05/23 05:26総合スコア16731
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
低評価覚悟で回答します。
いっそそういう言語を作ってはどうでしょうか。
アセンブラとCで、メモリ管理なしならC++などで。
投稿2018/12/25 13:57
編集2018/12/25 13:58総合スコア624
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
ロジックを文字列で表すことにこだわらなければ、例えばgaucheというlispの一種ですと、
bash@test-etc$ gosh gosh> (define x 0) x gosh> (set! x '(+ 3 4)) (+ 3 4) gosh> x (+ 3 4) gosh> (eval x (interaction-environment)) 7 ということができます。lispの種類によって書き方が変わりますが。 lispですと、xの中身を覗いたり、合成などできますが、そこまでしなくていいという場合は。例えばc言語ならばやりたいことを関数にして、その関数ポインタを変数に代入できます。 C++ならば、関数に名前を付けずにラムダ記法というものが使えます。(Lispでもラムダ記法の方がよく使われます)。 多くの言語でできると思います。 また、文字列で表された「ロジック」を(書き方の規則を定義して)評価するプログラムを書くということでも実行可能です。これは在る意味一種の小さな言語処理系を作るようなものです。
投稿2018/12/19 09:56
編集2018/12/25 10:33総合スコア100
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
既に回答として挙げられていますが、PHPやjavascriptのeval関数がこの代表例です。
そして、(これまた既出ですが)かなり危険なことが起こり得るものなのであまり多用したいものではありません。それどころかウイルスの手口としても有名です。さすがに「eval関数だけでウイルス検知対象となった」という話は聞きませんが、場合によっては振る舞い検知型のワクチンソフトに誤検知されることもありえるかもしれません。
投稿2018/05/23 14:13
総合スコア4830
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
Java
1IntBinaryOperator add = (left, right) -> left + right; 2System.out.println(add.applyAsInt(1, 2)); // 3 3System.out.println(add.applyAsInt(3, 4)); // 7
投稿2018/05/23 06:00
編集2018/05/23 06:01総合スコア4666
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
Java の標準ライブラリには JavaScript のエンジンがあるのでこれを使って、文字列をJavaScriptの式として評価することができます。
java
1String a = "1 + 3"; 2ScriptEngineManager manager = new ScriptEngineManager(); 3ScriptEngine engine = manager.getEngineByName("js"); 4int result = (int)engine.eval(a); 5System.out.println(result); 6 -> 4
投稿2018/05/23 05:19
総合スコア12
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。