質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

解決済

12回答

1592閲覧

ロジックを変数として持つ

NayuNayu

総合スコア11

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

0グッド

0クリップ

投稿2018/05/23 04:27

どの言語でもいいのですが、
変数内にロジックを記載してそれを実行って可能でしょうか?

String a = "1 + 3"
aを実行
結果 4
みたいな

※上のString云々はあくまで例です
※変数内にロジックを定義して、それをプログラムとして実行可能な言語が存在するか?という質問です

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

m.ts10806

2018/05/23 04:36 編集

「どの言語でもいい」のであれば特定の言語をタグにおくのではなく、例えば「アルゴリズム」とか「プログラミング言語」とか汎用性のあるタグにしてください。
fuzzball

2018/05/23 04:50

それって関数と何が違うのでしょうか? int a() {return 1+3;}
guest

回答12

0

投稿2018/05/23 04:38

tkturbo

総合スコア5572

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

otn

2018/05/23 05:07

ああ、なるほど。 「文字列を実行」と言う質問のつもりで回答してしまいましたが、 質問は「変数に入れてそれを実行」なので、tkturboさんn回答の方が良いか。
guest

0

ベストアンサー

スクリプト言語ではevalといって、文字列から実行を行う仕組みが内蔵されている例が多々あります。

ただし、文字列からコードを実行すると、

  • 文法的なエラーも実行時までわからない
  • 外部から文字列を流し込めると、本来実行させるつもりのないことまで実行させられてしまう
  • 速度が出ない

など多々問題がありますので、よほどの理由がない限り避ける、というのが常識のようになっています。

投稿2018/05/23 04:38

編集2018/05/23 04:40
maisumakun

総合スコア145183

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

いくつかの言語で、文字列を「文」として実行できます。
Perlの例:

Perl

1$foo = '$a = 1 + 3'; 2eval $foo; 3print $a; 4#=> 4

何らかの入力値を元に、文字列を組み立て、それを文として実行すると、脆弱性が作り込まれる危険があるので、採用時にはかなりの考慮が必要です。

それよりも、自分のプログラムで解釈して想定内の処理だけするのが安全です。
ということで、普通は使わないと思います。

投稿2018/05/23 04:40

otn

総合スコア84499

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

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

katoy

総合スコア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
fuzzball

総合スコア16731

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

そのロジックを実装した関数を用意しておいて、変数の数値により実行する関数を切り変えましょう

投稿2018/05/23 04:28

y_waiwai

総合スコア87747

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

低評価覚悟で回答します。

いっそそういう言語を作ってはどうでしょうか。
アセンブラとCで、メモリ管理なしならC++などで。

投稿2018/12/25 13:57

編集2018/12/25 13:58
yukkuri

総合スコア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
myoon

総合スコア100

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

既に回答として挙げられていますが、PHPやjavascriptのeval関数がこの代表例です。

そして、(これまた既出ですが)かなり危険なことが起こり得るものなのであまり多用したいものではありません。それどころかウイルスの手口としても有名です。さすがに「eval関数だけでウイルス検知対象となった」という話は聞きませんが、場合によっては振る舞い検知型のワクチンソフトに誤検知されることもありえるかもしれません。

投稿2018/05/23 14:13

HogeAnimalLover

総合スコア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
root_jp

総合スコア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

overkneeeboot

総合スコア12

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

例えばPHP

php

1$code = "echo (1+2);"; 2eval ( $code ); 3//3

ただし注意事項あり。

警告

eval() は非常に危険な言語構造です。 というのも、任意の PHP コードを実行できてしまうからです。 これを使うことはおすすめしません。 いろいろ検討した結果どうしても使わざるを得なくなった場合は、細心の注意を払って使いましょう。 ユーザーから受け取ったデータをそのまま渡してはいけません。 渡す前に、適切な検証が必要です。

投稿2018/05/23 04:41

m.ts10806

総合スコア80850

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問