1

私はmathematicaで非常に単純だが厄介な問題を抱えています:

先行ゼロを使用して記号を入力する必要がある/したい

\[alpha]^0123

またはさらに単純に

mysymbol[0123]

それを自分の内部表現に変換します

(Notation パッケージと IntegerDigits[] または Characters[] を使用)

==> myrep[{0,1,2,3}]

先頭に 0 がない入力では、すべて正常に機能します。

しかし、私が何を試しても (Unevaluated[] または Hold[])、mathematica (それは包括的なエバリュエーターですか?) は整数を変換します

0123 => 123

そのため、リストから 0 が失われます

もちろん、入力に引用符またはコンマを要求することで問題を回避できますが、それはかなり見栄えがよくありません!

何か案は?

4

1 に答える 1

3

私はこの質問に決定的な口調で答えましたが、間違っていました。0123、 、などの式は、誤って思い出したように、解析中に変換され16^^8bませ1*^6このため、重くて扱いにくいCellEvaluationFunctionにフォールバックする必要はありませんが、代わりに、はるかにユーザーフレンドリーな を使用できます$PreRead

$PreReadへの定義が行われると、すべての入力が変更され、 を変更しようとしても、これはまだ少し危険$PreReadです。たとえば、設定$PreRead = Null &すると、カーネルが再起動されるまで追加のコマンドを入力できなくなります。

私が理解しているように、あなたの望ましい行動を実行するために、以下を使用できます。

mysymbol[s_String] := myrep[FromDigits /@ Characters@s]

$PreRead = # /. {RowBox[{"mysymbol", "[", digits_String, "]"}] | 
                 RowBox[{digits_String, "//", "mysymbol"}] |
                 RowBox[{"mysymbol", "@", digits_String}] /; 
                 StringMatchQ[digits, DigitCharacter ..] :> 
                 ToBoxes[ mysymbol@digits ]} &;

テスト:

mysymbol[0123]
myrep[{0, 1, 2, 3}]
于 2012-09-26T11:20:21.160 に答える