Я использую метод макроса Леонида ( см. Здесь ), чтобы помочь мне управлять макетом управляющих переменных Manipulate
.
Но я обнаружил, что из макроса я не могу использовать другой макрос, определенный в другом месте.Так что мне интересно, есть ли способ использовать макрос из другого макроса?
Чтобы объяснить вопрос, я сначала покажу очень простую манипуляцию с использованием одноуровневого макроса, затем я покажу проблему,пытаясь использовать макрос из другого.
Manipulate[Text["ok"],
Evaluate@With[{
x = Function[{}, (*----> macro x *)
TabView[{
"x" -> "working on x"
}], HoldAll
],
y = Function[{}, (*----> macro y *)
TabView[{
"y" -> "working on y"
}], HoldAll
]
},(*WITH*)
(* now use the above macros *)
Grid[{
{SetterBar[Dynamic[choice], {1, 2}]},
{Dynamic[Which[choice == 1, x[], choice == 2, y[]] ]}
}]
],
{{choice, 1}, None},
ContentSize -> 300
]
Теперь добавьте макрос для флажка, а затем попробуйте использовать его из макроса 'x' выше:
Манипулировать [Text ["ok"],
Evaluate@With[{
checkBox = Function[{}, Checkbox[Dynamic[c]], HoldAll],
x = Function[{},
TabView[{
"x" -> checkBox[] (*=====> DOES NOT WORK, did not bind *)
}], HoldAll
],
y = Function[{},
TabView[{
"y" -> "working on y"
}], HoldAll
]
},(*WITH*)
Grid[{
{SetterBar[Dynamic[choice], {1, 2}]},
{Dynamic[Which[choice == 1, x[], choice == 2, y[]] ]}
}]
],
{{choice, 1}, None},
{{c, True}, None},
ContentSize -> 300
]
Мы видим, что это не сработало.Макрос «x» не «видел» макрос флажка.
Но если я добавлю код для флажка непосредственно в макрос 'x', он, конечно, будет работать:
Manipulate[Text["ok"],
Evaluate@With[{
x = Function[{},
TabView[{
"x" -> Checkbox[Dynamic[c]] (* add the definition directly *)
}], HoldAll
],
y = Function[{},
TabView[{
"y" -> "working on y"
}], HoldAll
]
},(*WITH*)
Grid[{
{SetterBar[Dynamic[choice], {1, 2}]},
{Dynamic[Which[choice == 1, x[], choice == 2, y[]] ]}
}]
],
{{choice, 1}, None},
{{c, True}, None},
ContentSize -> 300
]
Итак, вопрос в следующем: возможно ли использовать макрос, установленный выше, внутри макроса 'x'?
Чтобы сделать это проще, я НЕ передаю никакие аргументы макросам.Я просто использую макрос в качестве короткого имени для фрагмента большего фрагмента кода (определение управляющей переменной), как показано выше.
Это только для того, чтобы мне было проще расположить пользовательский интерфейс, перемещая только имя макроса, вместо перемещения большего фрагмента кода, который определяет макрос.Поскольку для Manipulate нет построителя графического интерфейса, этот метод помогает, когда имеется много элементов управления для управления.