如何修改盒子里的数据? (J编程)

How to amend data in a box? ( J programming)

我有一个复杂的盒子,

a =: 1 2 3 ; <4 ; < 5 6; <7 8
┌─────┬─────────────┐
│1 2 3│┌─┬─────────┐│
│     ││4│┌───┬───┐││
│     ││ ││5 6│7 8│││
│     ││ │└───┴───┘││
│     │└─┴─────────┘│
└─────┴─────────────┘

假设我知道inner box [5 6]的地址是( 1 1 0 ),即可以这样提取数据:

    >0{>1{>1{a
5 6

我的问题是,如何写一个函数(动词)来修改给定地址的数据? 例如地址 ( 1 1 0 ) 已知,我想将值 (5 6) 更改为一个小框 (<123),输出应为:

┌─────┬───────────────┐
│1 2 3│┌─┬───────────┐│
│     ││4│┌─────┬───┐││
│     ││ ││┌───┐│7 8│││
│     ││ │││123││   │││
│     ││ ││└───┘│   │││
│     ││ │└─────┴───┘││
│     │└─┴───────────┘│
└─────┴───────────────┘

可能是通过递归函数实现的,但是我想知道是否可以直接申请地址,就像>0{>1{>1{a.

感谢您的帮助!

您可以使用 monadic 原语 map ({::):[=25] 来确定您要查找的项目的地址 (1;1;0) replace/amend =]

   a=: 1 2 3;<4;<5 6;7 8
   {:: a
┌───┬─────────────────────────┐
│┌─┐│┌─────┬─────────────────┐│
││0│││┌─┬─┐│┌───────┬───────┐││
│└─┘│││1│0│││┌─┬─┬─┐│┌─┬─┬─┐│││
│   ││└─┴─┘│││1│1│0│││1│1│1││││
│   ││     ││└─┴─┴─┘│└─┴─┴─┘│││
│   ││     │└───────┴───────┘││
│   │└─────┴─────────────────┘│
└───┴─────────────────────────┘

{::fetch 的二元形式将 return 嵌套结构中的项目。

   (1;1;0) {:: a
5 6

不幸的是,目前没有 }:: 等同于 amend (}) although there is a recent request 来在具有您想要的功能的解释器中实现原语 }::

当我们等待实现该原语时,通过 J 编程论坛存档进行的搜索显示 a post 建议使用以下递归副词来完成您的要求:

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││   │││
│     ││ ││└───┘│   │││
│     ││ │└─────┴───┘││
│     │└─┴───────────┘│
└─────┴───────────────┘

我看到你的问题也被asked and answered on the J Forum. In the interests of completeness I've added a link to that more general solution

   (<123) [ applyintree (1;1;0) a
┌─────┬───────────────┐
│1 2 3│┌─┬───────────┐│
│     ││4│┌─────┬───┐││
│     ││ ││┌───┐│7 8│││
│     ││ │││123││   │││
│     ││ ││└───┘│   │││
│     ││ │└─────┴───┘││
│     │└─┴───────────┘│
└─────┴───────────────┘