問題タブ [postfix-notation]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - C++ でスタックを使用して後置を評価する
コードを変更して「pop」値を取得することはできましたが、操作がうまくいきませんでした。
java - コード内のスタック トレース
式の infix を postix に変換するこのコードのスタックにトレースを追加する方法を考えていました。
c# - C#で生成された++演算子のIL-プレフィックス/ポストフィックス表記が高速である場合と理由
この質問は、インクリメント演算子とプレフィックス/ポストフィックス表記の速度の違いに関するものなので、Eric Lippertがそれを発見して私を怒らせないように、質問を非常に注意深く説明します。
(私が尋ねている理由の詳細と詳細については、http://www.codeproject.com/KB/cs/FastLessCSharpIteration.aspx?msg = 3899456#xx3899456xx /を参照してください)
私は次のように4つのコードスニペットを持っています:-
(1)個別、プレフィックス:
(2)個別、後置:
(3)インデクサー、Postfix:
(4)インデクサー、プレフィックス:
私がやろうとしていたのは、このコンテキストでプレフィックス表記とポストフィックス表記の間にパフォーマンスの違いがあるかどうか(つまり、ローカル変数が揮発性ではない、別のスレッドから変更できないなど)があるかどうかを証明/反証することでした。 。
速度テストはそれを示しました:
(1)と(2)は同じ速度で動作します。
(3)と(4)は同じ速度で動作します。
(3)/(4)は(1)/(2)よりも約27%遅くなります。
したがって、後置記法自体よりも前置記法を選択することによるパフォーマンス上の利点はないと結論付けています。ただし、操作の結果を実際に使用すると、コードが単純に破棄される場合よりもコードが遅くなります。
次に、Reflectorを使用して生成されたILを調べたところ、次のことがわかりました。
ILバイト数はすべての場合で同じです。
.maxstackは4から6の間で変化しましたが、これは検証目的でのみ使用されるため、パフォーマンスには関係ないと思います。
(1)と(2)はまったく同じILを生成したので、タイミングが同じであることは当然です。したがって、(1)は無視できます。
(3)と(4)は、非常によく似たコードを生成しました。唯一の関連する違いは、操作の結果を説明するためのdupオペコードの配置です。繰り返しますが、タイミングが同じであることについては驚くことではありません。
そこで、(2)と(3)を比較して、速度の違いを説明できるものを見つけました。
(2)ldloc.0 opを2回使用します(1回はインデクサーの一部として、その後は増分の一部として)。
(3)ldloc.0を使用し、直後にdupopを使用しました。
したがって、(1)(および(2))のjの増分に関連するILは次のとおりです。
(3)次のようになります。
(4)は次のようになります。
今(ついに!)質問に:
JITコンパイラはldloc.0/ldc.i4.1/add/stloc.0
、ローカル変数を1ずつインクリメントするだけのパターンを認識し、それを最適化するため、(2)は高速ですか?(そして、dup
(3)と(4)の存在はそのパターンを壊すので、最適化は失われます)
そして補足:これが本当なら、少なくとも(3)については、dup
を別のものに置き換えてldloc.0
そのパターンを再導入しませんか?
c - 後置エバリュエーターが機能しない
どういうわけか、次の式でこのプログラムを実行すると12 12 * 66 +
、無効で否定的な答えが返されます-46
。何がうまくいかないのか知りたいので、できるだけ早く修正したいと思います。
python - Python の小さな言語
私はPythonで言語と呼ばれることさえないかもしれないものを書いています。私は現在いくつかの演算子を持っています: +
, -
, *
, ^
, fac
, . 階乗を計算し、変数の値を返し、変数を設定します。コードは以下です。この単純な言語で関数を定義する方法を書くにはどうすればよいでしょうか?@
!!
fac
@
!!
編集:コードを更新しました!
algorithm - Postfix から Infix への式変換アルゴリズム
Postfix から Infix への式変換アルゴリズムに関連するリソースを誰かに教えてもらえますか?
例は非常に役に立ちます。
postfix-notation - Applicative Language は Postfix Notation を使用できますか?
Factor のような後置言語は、前置言語 (Lispy 言語) や中置/後置言語 (演算子と関数の両方を含めれば、すべて C スタイルの言語) よりもはるかに読みやすいことが常にわかっています。
プレフィックス言語とは異なり、どこにでも区切り記号は必要ありません。中置記法とは異なり、覚えておくべき複雑な優先順位はありません。好きではないものは何ですか?
これらの言語はすべて連結しているように見えるため、ほぼ常にスタックベースです。
連結よりも適用可能であり、依然として後置ベースである現代的な言語を実装できますか?
coding-style - Do[...,{x,a,b}] の代わりに {x,a,b}//Do[...,#]& と書いてもいいですか?
私はルビーに恋をしています。この言語では、すべてのコア関数は実際にはメソッドです。そのため、処理したいデータが匿名処理関数の本体から左に配置されている場合、後置表記を好みます。たとえば、array.map{...}
. このコードが読みやすいという利点があると思います。
しかし、Mathetic は機能的であるため (必要に応じて手続き型にすることもできます)、関数名がデータの左側に配置されるスタイルが決まります。マニュアルでわかるように、//
は、 のような引数のない単純な関数の場合にのみ使用されlist // MatrixForm
ます。Function が多くの引数を必要とする場合、マニュアルを書いた人は syntax を使用しますF[data]
。
大丈夫ですが、私の問題は、F[f,data]
たとえばDo[function, {x, a, b}]
. ほとんどの Mathematica 関数は(すべてではないにしても)引数を正確にこの順序で持っています –[function, data]
ではなく[data, function]
. ノートブックに名前付き関数をたくさん作成するのではなく、純粋な関数を使用して名前空間をきれいに保つことを好むので、引数function
が大きすぎる可能性があります。data
関数呼び出しのある行の後のコードの 5 ~ 20 行目に配置されます。
これが、邪悪なRuby の性質が私を制御下に置いたときに、そのような関数を後置式に書き直す理由です。
私にとっては重要なので、その純粋な関数 (潜在的に大きなコード) はデータ処理からすぐに配置されます。ええ、私はそれを行い、私は幸せです。しかし、次の 2 つのことがあります。
- これにより、Mathematica の強調表示パーサーの問題が発生
x
します。後置記法は青緑色ではなく青色で強調表示されます。 - Mathematica のマニュアルを調べるたびに、次のような例を目にします:
Do[x[[i]] = (v[[i]] - U[[i, i + 1 ;; n]].x[[i + 1 ;; n]])/ U[[i, i]], {i, n, 1, -1}];
、つまり、彼らは、Mathematica が読みやすい/サポートしやすい/などと考えているということです?!
これらの 2 つのことから、ここでこの質問をするようになりました: Ruby スタイルを使用する私はとても悪い少年ですか?これらの人のようにコードを書くべきですか、それとも大丈夫ですか? 心配する必要はありません。好きなように書く?
java - Postfix Evaluation での Java アルゴリズムの実装に助けが必要
このコードを最初から書き、コーディングして実行しようとしましたが、うまくいかないようです。これは、クラスのラボワークとして割り当てられました。要件は次のとおりです。 スタックおよびスタック操作 (ユーザー定義) を使用して後置評価を実装する。私のプログラムのアルゴリズムは正しいと思いますが、いつも間違った答えを返します。これが私のコードです。
サンプル出力: 評価する入力 Postfix フォーム:
java - 中置から後置への変換における括弧の認識
これが、データ構造クラス用に作成する必要のあるJavaクラスです。これが変換を行うための最良の方法とはほど遠いことを私は知っていますが、それは彼がクラスで与えた擬似コードから外れており、そのために彼が探しているものです。彼が私たち自身で理解するために残した唯一のことは、アルゴリズムが括弧をどのように認識するかということでした。これらを使用せずに式を入力すると、プログラムは正常に実行されますが、括弧を追加するとプログラムは実行されません。具体的には、デバッグの結果、閉じ括弧がこれを実行することがわかりました")"。メソッドの実際の括弧部分がどこにあるかコメントでマークしました。助けてくれてありがとう!