函数选项的一个问题

@2015-8-21

DownValue形式的函数选项不起作用的问题


函数选项的一个问题_1.gif


函数选项的一个问题_2.png

函数选项的一个问题_3.png

看似选项a有了一个值,但是,换一个选项值就不灵喽


函数选项的一个问题_4.png

函数选项的一个问题_5.png

那么问题来了,如何让结果变成{7,a1}呢?

当然原因是我们不能这样定义选项


函数选项的一个问题_6.png

目的

我的目的是在写一些相似的函数时,及具有多种变换时,管理起函数名来,更方便。
简单地说,我们使用了f1,f2,f3定义了10个函数,其实可以重载为一个f及多种选项的组合,这样我们有一个f,可以解决10种情形,而当我们有100种情形时,我们有10个函数,而这10个函数又是相似的,因此统一命名在开发中,进行查找,替换,编程操作函数的格式化[元编程]等都会极其方便。

通常的Writing节奏,ForExample@Me,都是写一两个函数看看,解决一些问题,看看有没有各种坑,了解了一些坑后,再优化。

遇到新的相似问题了,先Copy一个模板代码到一些Section,然后修改修改,要是有10个Section,然后发现要修改一些共通的部分,就只好修改十次,这个时间如果时间允许,就可以进行优化。

使用DownValue的一个问题自然是把函数名和变量名统一管理起来。

Solution1

这种方式其实只不过是套装了一个通常的f而已


函数选项的一个问题_7.gif


函数选项的一个问题_8.png

函数选项的一个问题_9.png


函数选项的一个问题_10.png

函数选项的一个问题_11.png


函数选项的一个问题_12.png

函数选项的一个问题_13.png

注意到,d这里是没有上值的


函数选项的一个问题_14.gif

函数选项的一个问题_15.png

注意到,这里f是没有下值的


函数选项的一个问题_16.png


函数选项的一个问题_17.png

函数选项的一个问题_18.png


函数选项的一个问题_19.png


函数选项的一个问题_20.png


函数选项的一个问题_21.png

函数选项的一个问题_22.png


函数选项的一个问题_23.png

函数选项的一个问题_24.png

为何要整得这么麻烦?假设我们有10个函数,f1,f2,f3,f4作为外层的函数,又有g1,g2作为内层的函数,那么f系列函数与g系列的函数结合起来就有许多函数了。比如h1=f1[g1],h2=f2[g1],h3=f1[g1],h4=f2[g4],当我们修改g1时,h1/h2/h3都能得到修改,而不用修改三次。

其实在这个Section中,当我们折腾上下值的时候,稍有一点函数式作为一等公民的意味,函数作为参数。

DownValues-UpValues

无非是通过一些基础变量名去查找一些规则,这些规则应用了复合的变量名

TagSet


函数选项的一个问题_25.gif

我们看到使用TagSet是rate没有下值的,我们看到chf变黑了,它有了一个上值


函数选项的一个问题_26.png

函数选项的一个问题_27.png


函数选项的一个问题_28.png

函数选项的一个问题_29.png


函数选项的一个问题_30.png

这种方式定义变量时,rate就有了下值,而这就是帮助里说的
For downvalues, the tag is redundant:
这种方式是我用得较多的,同时还有一个问题待解决,标记一下[汲及到程序包的上下文的一个问题]。

UpSet


函数选项的一个问题_31.png


函数选项的一个问题_32.png

函数选项的一个问题_33.png


函数选项的一个问题_34.png

函数选项的一个问题_35.png

总结

如果你想一个符号有下值,就用TagSet或Set,否则就用UpSet

回到原问题


函数选项的一个问题_36.gif

函数选项的一个问题_37.png


函数选项的一个问题_38.png

函数选项的一个问题_39.png

其实并没有解决我原来的最初的问题,我当时遇到问题时,是使用查找替换功能将f[g]替换成了f1,而f1能正常使用,如果用这个Section的方式,则后续使用f[g]再跟f1关联起来,另一种方式是


函数选项的一个问题_40.gif

函数选项的一个问题_41.png


函数选项的一个问题_42.gif

函数选项的一个问题_43.png


函数选项的一个问题_44.png

函数选项的一个问题_45.png

更暴力的方式

当函数不使用选项时,这种定义方式是能够解决一些问题的并且方便的一种方式,当开始优化函数时,再修改。


函数选项的一个问题_46.png

Practice

Version1


函数选项的一个问题_47.png

Version2

先Copy一个再修改


函数选项的一个问题_48.png


函数选项的一个问题_49.png


函数选项的一个问题_50.png


函数选项的一个问题_51.png

函数选项的一个问题_52.png


函数选项的一个问题_53.png

函数选项的一个问题_54.png

遇到问题喽,肿么办

Version3


函数选项的一个问题_55.png


函数选项的一个问题_56.png


函数选项的一个问题_57.png


函数选项的一个问题_58.png

函数选项的一个问题_59.png

Version4


函数选项的一个问题_60.png


函数选项的一个问题_61.png


函数选项的一个问题_62.png


函数选项的一个问题_63.png

函数选项的一个问题_64.png


函数选项的一个问题_65.png

函数选项的一个问题_66.png

总结