Печать имени и значения символа в Mathematica - PullRequest
10 голосов
/ 02 ноября 2011

Я хотел бы создать функцию My`Print[args__], которая печатает имена символов, которые я передаю, вместе с их значениями.Проблема в том, что перед передачей символов в My`Print они оцениваются.Так что My`Print никогда не увидит имена символов.

Одним из решений является окружение каждого аргумента, который я передаю My`Print, Unevaluated[], но это кажется грязным.Есть ли способ определения MACRO такой, что когда я набираю My`Print[args__], ядро ​​Mathematica видит My`Print[Unevaluated /@ args__]?

Ответы [ 6 ]

12 голосов
/ 02 ноября 2011

Вам необходимо установить атрибут HoldAll в вашей функции с помощью SetAttribute[my`print].

Вот возможная реализация:

Clear[my`print]
SetAttributes[my`print, HoldAll]
my`print[args__] := 
 Scan[
  Function[x, Print[Unevaluated[x], " = ", x], {HoldAll}], 
  Hold[args]
 ]

Я использовал строчные буквыимена, чтобы избежать конфликтов со встроенными модулями или функциями из пакетов.

РЕДАКТИРОВАТЬ:

Просто чтобы сделать это явным: у меня есть две функции здесь.Один из них напечатает значение одного символа и будет реализован внутри Function.Вы можете просто использовать это самостоятельно, если этого достаточно.Другая - это действительная функция my`print.Обратите внимание, что оба должны иметь атрибут HoldAll.

10 голосов
/ 02 ноября 2011
ClearAll[My`Print]
SetAttributes[My`Print, HoldAll]
My`Print[args___] := 
 Do[
   Print[
      Extract[Hold[args], i, HoldForm], "=", List[args][[i]]
   ], {i, Length[List[args]]}
 ]

ape = 20;
nut := 20 ape;
mouse = cat + nut;

My`Print[ape, nut, mouse]

(* ==>
ape=20
nut=400
mouse=400+cat
*)
9 голосов
/ 02 ноября 2011
SetAttributes[MyPrint, HoldAll];
MyPrint[var_] := 
  Module[
    {varname = ToString[Hold[var]]},
    Print[StringTake[varname, {6, StringLength[varname] - 1}], 
                " = ", Evaluate[var]]
  ]
6 голосов
/ 04 ноября 2011

Опоздание на вечеринку - можно использовать Listability, чтобы получить довольно элегантное (IMO) решение, избегающее явных циклов или управляющих конструкций оценки:

ClearAll[prn];
SetAttributes[prn, {HoldAll, Listable}];
prn[arg_] := Print[HoldForm[arg], " = ", arg];
prn[args___] := prn[{args}]

Кража контрольного примера у @ Sjoerd,

In[21]:= prn[ape,nut,mouse]

During evaluation of In[21]:= ape = 20
During evaluation of In[21]:= nut = 400
During evaluation of In[21]:= mouse = 400+cat

Out[21]= {Null,Null,Null}
5 голосов
/ 03 ноября 2011

Вот еще один вариант My`Print для добавления к миксу:

ClearAll[My`Print]
SetAttributes[My`Print, HoldAll]
My`Print[expr_] := Print[HoldForm[expr], " = ", expr]
My`Print[exprs___] := Scan[My`Print, Hold[exprs]]

... и еще один ...

ClearAll[My`Print]
SetAttributes[My`Print, HoldAll]
My`Print[args___] :=
  Replace[
    Unevaluated @ CompoundExpression @ args
  , a_ :> Print[HoldForm[a], " = ", a]
  , {1}
  ]

В любом случае, использование одинаково:

$x = 23;
f[x_] := 1 + x

My`Print[$x, $x + 1, f[1]]

(* prints:
   $x = 23
   $x+1 = 24
   f[1] = 2
*)
2 голосов
/ 04 ноября 2011

В дополнение к другим ответам рассмотрим функции DownValues, OwnValues ​​и UpValues:

In[1] := f[x_] := x^2

In[2] := f[x_, y_] := (x + y)^2

In[3] := DownValues[f]

Out[3] = {HoldPattern[f[x_]] :> x^2, HoldPattern[f[x_, y_]] :> (x + y)^2}

http://reference.wolfram.com/mathematica/ref/DownValues.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...