Dyalog APL中的“APL对象表示法”

时间:2017-05-29 12:57:10

标签: apl dyalog

如何将任何Dyalog APL值转换为可传递给以获得相同值的字符向量?

预期如何:

      x←2 3⍴⍳6
      x←1,⊂x
      x←x,⊂'foo'
      y←desired_function x
      DPX y
┌→─────────────────┐
│1,(⊂2 3⍴⍳6),⊂'foo'│
└──────────────────┘
      x≡⍎y
1

更新

我们的想法是将值转换为人工可编辑的APL源代码,以便在找到新的有问题的场景时将其插入单元测试函数。我希望这些测试场景是在APL源代码中,而不是在文件中,因为在我使用的框架中,源代码由版本控制系统很好地管理,而文件则不是。我希望它是人类可编辑的,而不仅仅是序列化的,以便在参数/结果发生变化时更容易修改现有的测试场景。

5 个答案:

答案 0 :(得分:3)

在我看来,Execute& "转移表格"由于多种原因,它们不是最佳解决方案:

  • 复杂结构很快变得难以阅读
  • 与其他解决方案相比,Execute是一个相对繁重/效率低下的工具
  • 如果你不小心,你可以打开自己注射"注射"攻击,文件中的恶意代码,应该包含常量但在应用程序启动时正在执行。

根据您的数据情况,JSON可能是一个很好的方式 - 它是专为此设计的格式:

在Dyalog 15.0中:

       fromJSON←7159⌶ ⋄ toJSON←7160⌶ 
       (namespace←⎕NS '').life←42
       toJSON (⍳4) 'Hello' namespace
[[1,2,3,4],"Hello",{"life":42}]

JSON的缺点是它不能代表更高维数组。因此,如果你需要基质,你需要按摩一些东西:

       toJSON ↓3 4⍴⍳12 
[[1,2,3,4],[5,6,7,8],[9,10,11,12]]
       ↑fromJSON '[[1,2,3],[5,6,7]]'
1 2 3
5 6 7

在将于本月底发布的16.0版中,实验性I-Beams已成为系统函数⎕JSON。

答案 1 :(得分:1)

不确定Dyalog APL,但大多数其他APL都有内置功能 实现这一点。

在IBM APL2中(因此也在GNU APL中),您可以使用2⎕TF在值(实际上是具有该值的变量)和生成它的APL代码之间进行转换(尽管不是通过但是通过另一个2⎕TF):

      10 ⎕CR 'x'
 x←1 00 00   ((⎕IO+1)⊃x)←2 3⍴1 2 3 4 5 6   ((⎕IO+2)⊃x)←'foo' 

      ⊃10 ⎕CR 'x'
    x←1 00 00                    
      ((⎕IO+1)⊃x)←2 3⍴1 2 3 4 5 6
      ((⎕IO+2)⊃x)←'foo'          

在GNU APL中,您也可以使用10⎕CR来实现此目的。结果包含多个APL语句,因此您必须⍎¨结果:

{{1}}

答案 2 :(得分:1)

我不知道是否有办法用⍎做到这一点,但我会提到Dyalog版本15.0有2个I-Beams来序列化和反序列化。

http://help.dyalog.com/15.0/Content/Language/Primitive%20Operators/Serialise%20Array.htm

e.g。

]disp x
┌→┬─────┬───┐
│1│0 1 2│foo│
│ │3 4 5↓   │
└─┴~───→┴──→┘

   y← 0(220⌶) 0(219⌶) 1(219⌶) 1(220⌶) x

  ]disp y
┌→┬─────┬───┐
│1│0 1 2│foo│
│ │3 4 5↓   │
└─┴~───→┴──→┘

      y ≡ x
1

此外,您可能希望加入我们的论坛,因为如果您在那里提出问题,您会联系更多Dyalog APL用户。

http://www.dyalog.com/forum/

此致

文斯

答案 3 :(得分:1)

⎕SE.Dyalog.Utils.repObj

例如:

      x←2 3⍴⍳6
      x←1,⊂x
      x←x,⊂'foo'
      y←⎕SE.Dyalog.Utils.repObj x
      ]Display y
┌→─────────────────────┐
│1 (2 3⍴1-⎕io-⍳6) 'foo'│
└──────────────────────┘
      x≡⍎y
1

Try it online!

答案 4 :(得分:0)

除非我遗漏了某些内容,否则口译员不提供保存和保存的机制。重建变量的任何可能的类型(其中包含名称空间,对象,对这些变量的引用等)很复杂。 "序列化"可能最接近,但(a)它不是人类可读的;(b)它更像是一个解释器机制,而不是应用程序开发人员的工具,所以我甚至不想进一步谈论它 - 有更好的方法来解决这个问题;)

但是,有一个用户命令可以让你这样做:

]save (Object) (Filename)

所以

]save x h:\temp\x

将其保存到unicode文件h:\ temp \ x.dyalog,也可以使用任何支持Unicode的编辑器(甚至)编辑h:\ temp \ x.dyalog进行编辑。

通过

]load h:\temp\x

您可以将该对象加载到工作区中。或者,使用

]xyz←load h:\temp\x -noname

将值分配给xyz,而不是再次加载到x

还有更多... 我认为您的问题是希望能够重现某些数据的结果。你知道"组件文件系统"它提供了一种简单的方法来将x等变量保存到文件中并从那里重新加载它们? 例如:

{x ⎕fappend ⍵ ⋄ ⎕FUNTIE ⍵}'h:\temp\x'⎕FCREATE 0

保存x然后

{r←⎕fread ⍵,1 ⋄ ⎕FUNTIE ⍵ ⋄ r}'h:\temp\x'⎕FTIE 0

再次阅读。 (免责声明:这些示例过于简单,因为如果您正在创建的文件已经存在,则没有错误处理等等 - 通常也需要处理,但这本来也是如此这个小样本让人分心......)

所以,最后,我认为我真正关心的是这个问题的背景以及你试图实现的目的。在我的整个APL生活中,我很少看到那些不可行的东西" - 但有时路径不同于你所期望的(了解其他语言)......