广义的输入

包括 Wolfram 语言在内的绝大多数计算机语言的基本范例是给定输入并处理到输出中. 历史上,这个输入由遵循一定语法的字母和数字串组成.
计算这个输入行,产生一个输出的表格:
从第三版本开始, Wolfram 语言已经支持使用二维的排版数学符号作为输入,可以和文本的输入自由地混合在一起.
这也产生一个输出的表格:
从第六版本开始,范围广泛的非文本的对象也能简单地被用来作为输入,并且能和文本或排版的符号混合起来使用.
计算以下的输入,然后移动滑块来再一次计算它以便看到一个新的结果:
当被作为输入时,滑块的数值由它的位置来决定,在这里是一个在1和10之间的整数. 它能在一句输入行里的任何能使用文本的数字或变量名的地方被使用.
怎样创造这样的控件将在下一节讨论,但是首先值得注意的是,在许多情况下有比这一种输入更好的其它选择.
将这个例子铸入到一个 Manipulate 形式中能使你看到实时移动滑块的效果:
但是有一些情况是在传统的 Shift+Return 所计算的输入里面,嵌入控件会工作得更好一些. 这些情况是:如果计算很缓慢,如果你希望在控件周围编辑其余的输入行时有完全的灵活性,或者编码的目的是写定义以便稍后使用,以及使用控件指定初始值等.
例如,你希望设置一个颜色调色板,使用 ColorSetter (颜色设置)来初始化在接下来的程序中将被使用的命名的颜色:
点击任何颜色色板来得到一个对话框使你能交互式选择一个新的颜色. 这些数值在接下来的程序中将被使用就好像它们已经被更传统的文本指定的数值初始化了:
这些颜色色板提供了一个有信息的,比一个由数字颜色值组成的表达式更容易编辑的颜色的表现形式.
如何创建内嵌的控件
在 Wolfram 语言里创建任何事物的最灵活和最强大的方式是计算一个函数来返回它.
这些例子使用 Slider (滑块),但是同样的原理适用于任何控件. 控件对象列举了所有可被使用的控件对象.
你能通过计算 Slider[] 创建一个滑块:
得到的滑块对象能被复制和粘贴到一个随后的输入单元中就好像它是任何其它种类的输入一样. (或者就在输出单元中点击和开始输字,这会使它自动地被转化为一个输入单元.)
由这种方式创建的控件对计算是惰性的.
例如,敲入 2+,然后把前面的滑块粘贴到 + 的后面来创建这个输入行,然后计算它:
当被计算时,滑块仍保持为一个滑块,这不是我们所希望的(尽管在其它情况下是非常有用的). 所需要的不是一个滑块,而是当作为一个输入被计算时,输出为一个它所设置的数值,而不是一个滑块对象.
DynamicSetting[e]
一个显示为 e 的对象,但是被解释为,在计算时 e 的动态更新的当前的设置
计算成它的当前设置的对象.
DynamicSetting (动态设置)封装一个滑块并被计算时,新的滑块看上去和最初的滑块一样,但是有计算它的当前设置这么一个隐藏的特性.
这显示了新的滑块:
如果新的滑块被复制和粘贴到一个输入行里,计算时就把滑块转化成它的当前数值(如果它还没有被鼠标移动,那么默认值是0.5):
上一节里的例子是用 DynamicSetting 以这个方式创建的.
尽管复制和粘贴能很有效地被用来建立含有控件的输入行,通常最方便的是使用 在当前位置上计算 Ctrl+Shift+Enter (在 Mac 上使用 Command+Return ) 来转化适当的控件表达式,尤其是当你对创建控件的命令熟悉时.
Ctrl+Shift+Enter
计算当前的选择,用输出来替换选择
在当前的位置上计算.
例如,输入以下的输入行:
然后,选中整个控件表达式.(点击三下 DynamicSetting 这个词是做这个尤其快的一个方法.)
敲入 Ctrl+Shift+Enter (在 Mac 上使用 Command+Return ),控件表达式将在当前的位置上被转化成一个实际的控件.(注意 Ctrl+Shift+Enter 不是为计算输入而使用的正常的 Shift+Enter.)
Shift+Enter 计算输入单元然后会给出理想的结果:
所有的 Slider 的自变量可被用来改变初始值、范围和步长.
从这个输入表达式开始:
然后在相应的位置上计算(Ctrl+Shift+Enter) 来把文字的命令转化成一个滑块:
当然这和其它种类的控件也一样地工作得好:
这是在应有的位置上计算后的结果:
注意控件表达式不像它们正常情况下一样包含对一个变量的动态参照(参看 "动态简介"). 这里描述的在输入表达式中使用的控件是静态的,惰性的对象,很像一个文本的命令. 它们不相互连接,并且在你移动一个时什么也不发生,除了它移动之外. 基本上它们只是记录它们当前的状态,为了在你计算输入行时使用.
输入表达式中的复杂的模板
在输入表达式中使用包含多个控件的整个面板是可行的. 构造这样的面板比只是用 DynamicSetting 封装一个单一的控件更复杂,这是因为你必须指定在模板被计算时应该如何把各种控件的数值集合到返回的数值里.
Interpretation (解释)这个函数被用来集合一个独立的输入模板对象,它可能包含许多通过动态变量来互动的内部部件. 自变量是 Interpretation[variables,body,returnvalue].
第一个自变量给出一列局部变量,带有和 ModuleDynamicModule 形式相同的选择性的初始化.(实际上,Interpretation 在输出中创建一个 DynamicModule. 参看 "动态简介".)
第二个自变量被排版成为解释对象的显示形式. 通常它包含带有对在第一个自变量中定义的变量的动态参照的格式化构造和控件.
第三个自变量是一个表达式,它在解释对象被给为输入时将作为它的数值使用. 通常这是一个涉及到列举在第一个自变量里的变量的表达式.
Interpretation[e,expr]
一个显示为 e 的对象,但是如果被提供为输入它被解释为 expr 的未计算的形式
Interpretation[{x=x0,y=y0,},e,expr]
允许局部变量在 eexpr
显示为一个表达式而计算为另一个的对象.
计算以下的输入单元创建一个含有一个 Plot (画图)命令的模板的输出单元:
这个模板能被复制和粘贴到一个输入单元中,并且你可以编辑数值. Shift+Return 计算输入单元并产生一个图形:
在以下的更复杂的例子中, definite 这个变量被用来在模板中的控件之间进行交流,当选不定积分时,minmax 数值区域变暗:
复制以上模板,给出计算之后得到的积分:
就像和以前章节中的单一控件一样,这些输入模板能被复制和粘贴到一个新的输入单元中,并且它们能和文本的输入自由地混合在一起.
为了检查积分的结果,以 D 来封装模板,求导数并核对结果,和出发点是一样的:
这些例子是相当普遍的:它们看上去像许多程序设计里的对话框. 但是有一些重要的区别. 例如,注意输入区中的 . Wolfram 系统中的输入域也许看上去和其它程序设计中的一样,但是内容能够是任意排版的数学,或者甚至是图像或其它的控件.(看下一节来了解如何编写彼此嵌套的模板.)
Wolfram 系统模板(和对话框)也不局限于使用一个规则的文本域网格.
这里是一个简单的按印刷方式布局的定积分模板:
注意你不需要一个模板来计算积分;它们能够用快捷键或基本输入面板以简单的排版数学公式来输入(像在 "输入二维表达式" 中描述的一样):
制作这样的一个模板是否有用取决于很多因素,但是重要的一点是在 Wolfram 系统中格式化构造的广范围,包括文字、排版数学、以及图像,可用于输入字段和模板的里面和周围.
高级论题:处理模板中不成熟的计算
如果在初始化中给定的变量已经被赋予了其它的数值(例如,如果在上一节中的变量 x 有一个数值),或者模板结构被粘贴到输入域里,像那些在上一节中定义的模板不会如你所希望地一样工作. 为了正确地处理计算的问题,有必要使用 InputField (输入域)对象把它们的数值保存在非解析的盒框结构形式中而不是表达式的形式中.(盒框结构代表任何可能的可显示的结构,无论它是否是Wolfram 语言合法的输入表达式,从这个意义上,盒框结构是如同符号串的.)
这定义一个模板:
以上模板的复制本给出了计算之后立即得到的积分:
这个模板会恰当地工作,甚至是在也许被认为是滥用的情况下. 例如,你能重复地嵌套它来对一个函数积分多次:
注意 InputField 是如何自动地扩展来容纳更大的内容的.(这个行为由 FieldSize 选项来控制.)
印刷上的模板也能被做成很强健以便计算:
作为输入的图形
图形对象,包括 GraphicsGraphics3D,画图命令的输出,以及从外部图像文件导入的图形,都能被作为输入使用并且能同文字的输入自由地混合在一起. 在混合图形、控件、排版的数学,和文字上没有任意的限制.
计算一个简单的画图命令:
然后点击来把插入点放到图形的左边并输入 "Table["
在图形的右边点击和输入,然后计算,来完成这个命令:
注意图形是怎样取决于它的上下文而以各种不同的尺寸出现的. 有三个标准的自动的图形尺寸,如果图形自身是在一个输出里那么是最大的,如果在一个列单或表格输出中使用就小一些,如果是在一个文字输入行里那么是最小的. 这主要是为了便于使图形输入不太庞大. 你总是可以通过点击它和使用调整大小的句柄,或者包括一个明确的 ImageSize 选项来自由地调整图形的大小.
你能从一个文件中导入一个位图图像:
然后把这复制和粘贴到一个输入单元中,进行简单的图像处理:
能使用图形来作为输入的能力容许非常丰富的输入,就像在这个简单的 Manipulate 的例子中一样: