我有一个复杂的盒子,
a =: 1 2 3 ; <4 ; < 5 6; <7 8
┌─────┬─────────────┐
│1 2 3│┌─┬─────────┐│
│ ││4│┌───┬───┐││
│ ││ ││5 6│7 8│││
│ ││ │└───┴───┘││
│ │└─┴─────────┘│
└─────┴─────────────┘
假设我知道内盒[5 6]的地址是(1 1 0),即可以像这样提取数据:
>0{>1{>1{a
5 6
我的问题是,如何编写一个函数(动词)来修改给定地址的数据? 例如地址(1 1 0)已知,我想将值(5 6)更改为一个小方框(&lt; 123),输出应为:
┌─────┬───────────────┐
│1 2 3│┌─┬───────────┐│
│ ││4│┌─────┬───┐││
│ ││ ││┌───┐│7 8│││
│ ││ │││123││ │││
│ ││ ││└───┘│ │││
│ ││ │└─────┴───┘││
│ │└─┴───────────┘│
└─────┴───────────────┘
可以通过递归函数来实现,但我想知道地址是否可以直接应用,就像&gt; 0 {&gt; 1 {&gt; 1 {a。
感谢您的帮助!
答案 0 :(得分:4)
您可以使用monadic原语map(x
)确定要替换/修改的项目的地址(1;1;0
):
{::
a=: 1 2 3;<4;<5 6;7 8
{:: a
┌───┬─────────────────────────┐
│┌─┐│┌─────┬─────────────────┐│
││0│││┌─┬─┐│┌───────┬───────┐││
│└─┘│││1│0│││┌─┬─┬─┐│┌─┬─┬─┐│││
│ ││└─┴─┘│││1│1│0│││1│1│1││││
│ ││ ││└─┴─┴─┘│└─┴─┴─┘│││
│ ││ │└───────┴───────┘││
│ │└─────┴─────────────────┘│
└───┴─────────────────────────┘
,fetch的二元形式将从嵌套结构中返回该项目。
{::
不幸的是,目前没有 (1;1;0) {:: a
5 6
等同于amend(}::
),尽管在解释器中有recent request来实现原始}
具有您想要的功能。
当我们等待实现该原语时,通过J编程论坛档案搜索显示a post,其中提出了以下递归副词,它可以满足您的要求:
}::
我看到你的问题也是asked and answered on the J Forum。为了完整起见,我添加了指向more general solution的链接。
store=: adverb define
:
if. #m do. (< x (}.u)store ({.u){::y) ({.m)} y else. x end.
)
(<123) (1;1;0) store a
┌─────┬───────────────┐
│1 2 3│┌─┬───────────┐│
│ ││4│┌─────┬───┐││
│ ││ ││┌───┐│7 8│││
│ ││ │││123││ │││
│ ││ ││└───┘│ │││
│ ││ │└─────┴───┘││
│ │└─┴───────────┘│
└─────┴───────────────┘