Я бы не стал полагаться на парсинг Mathematica. Вместо этого я бы определил правила для MakeExpression
для foo
. Это позволяет вам перехватывать ввод в виде блоков, прежде чем он будет проанализирован в числах с плавающей точкой. Эта пара правил должна быть хорошей отправной точкой, по крайней мере, для StandardForm
:
MakeExpression[RowBox[{"foo", "[", dateString_, "]"}], StandardForm] :=
With[{args = Sequence @@ Riffle[StringSplit[dateString, "."], ","]},
MakeExpression[RowBox[{"foo", "[", "{", args, "}", "]"}], StandardForm]]
MakeExpression[RowBox[{"foo", "[", RowBox[{yearMonth_, day_}], "]"}],
StandardForm] :=
With[{args =
Sequence @@ Riffle[Append[StringSplit[yearMonth, "."], day], ","]},
MakeExpression[RowBox[{"foo", "[", "{", args, "}", "]"}], StandardForm]]
Мне нужно второе правило, потому что интерфейс ноутбука «услужливо» вставит пробел, если вы попытаетесь ввести второе десятичное место в числе.
РЕДАКТИРОВАТЬ: Чтобы использовать это из ядра, вам нужно будет использовать интерфейс, но это часто довольно просто в версии 7. Если вы можете получить выражение в виде строки, используйте UsingFrontEnd
в сочетании с ToExpression
:
UsingFrontEnd[ToExpression["foo[2009.09.20]", StandardForm]
РЕДАКТИРОВАТЬ 2: Существует множество возможностей, если вы хотите поиграть с $PreRead
, что позволяет применять специальную обработку для ввода, в виде строк , до того, как они ' разобран.