一种默认使用连词和副词的方法吗?

时间:2018-03-28 16:52:40

标签: j tacit-programming

这是一个天真的斐波那契序列:

   (,[:+/_2&{.)^:10]0 1      NB. 10 + 2 elements
0 1 1 2 3 5 8 13 21 34 55 89

这是明确的monadic版本:

   3 :'(,[:+/_2&{.)^:y 0 1' 10
0 1 1 2 3 5 8 13 21 34 55 89

问题是:在隐性定义中,我能否以某种方式为^:连词提供最右边的参数,以便(在我的脑海中):

   ((,[:+/_2&{.)^:y 0 1)10
0 1 1 2 3 5 8 13 21 34 55 89

会产生预期的结果吗?或者,更正确的定义(再次,我的头脑):

   ((,[:+/_2&{.)^:(y-2)1 1)10
1 1 2 3 5 8 13 21 34 55

更一般地说:是否可以在J中默认定义副词和连词,或者只能使用明确的定义?

我的直觉(以及来自this问题的材料)告诉我,我应该走到黑暗的一边,详细了解动名词和` / `:连词。那是对的吗?如果是这样,我会很感激任何有关此问题的新手友好材料:)

1 个答案:

答案 0 :(得分:2)

我认为我的自然方法是创建一个二元动词,其中左参数是迭代次数,右参数是初始字符串。这允许我轻松扩展字符串。

fib0=: (,[:+/_2&{.)@]^:[ 
   10 fib0 0 1
0 1 1 2 3 5 8 13 21 34 55 89
   11 fib0 0 1
0 1 1 2 3 5 8 13 21 34 55 89 144

我可以通过填充(,[:+/_2&{.)左边的参数^:10作为左参数来单独创建一个动词。虽然扩展字符串不太灵活。

  fib1=: (,[:+/_2&{.)^: 10
   fib1 0 1
0 1 1 2 3 5 8 13 21 34 55 89

我最后伪造了你可能正在寻找的结果,在定义中附加0 1并创建一个寻找迭代次数的monadic动词。

  fib2=: ((,[:+/_2&{.)@](^: [))& 0 1
   fib2 10
0 1 1 2 3 5 8 13 21 34 55 89
   fib2 11
0 1 1 2 3 5 8 13 21 34 55 89 144

但你想知道是否有办法默认使用副词。根据我上面显示的内容,您可以通过在左侧添加动词^:从合作(,[:+/_2&{.)创建副词。

   afib=: (,[:+/_2&{.) ^: 
   (10 afib)                 NB. an adverb takes its left argument creating a conjunction.
(, ([: +/ _2&{.))^:10
   (10 afib) 0 1
0 1 1 2 3 5 8 13 21 34 55 89
   (11 afib) 0 1
0 1 1 2 3 5 8 13 21 34 55 89 144