繁体   English   中英

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

[英]“APL Object Notation” in Dyalog APL

如何将任何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源代码中,而不是在文件中,因为在我使用的框架中,源代码由版本控制系统很好地管理,而文件则不是。 我希望它是人类可编辑的,而不仅仅是序列化的,以便在参数/结果发生变化时更容易修改现有的测试场景。

在我看来,执行和“转移形式”不是最佳解决方案,原因如下:

  • 复杂的结构很快就变得难以阅读
  • 与其他解决方案相比,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。

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

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

      4 ⎕CR x
┏→━━━━━━━━━━━━━━┓
┃1 ┏→━━━━┓ ┏→━━┓┃
┃  ↓1 2 3┃ ┃foo┃┃
┃  ┃4 5 6┃ ┗━━━┛┃
┃  ┗━━━━━┛      ┃
┗∊━━━━━━━━━━━━━━┛


      ⎕←text←2 ⎕TF 'x'
x←1 (2 3⍴1 2 3 4 5 6) 'foo'

      )erase x
      2 ⎕TF text
x
      4 ⎕CR x
┏→━━━━━━━━━━━━━━┓
┃1 ┏→━━━━┓ ┏→━━┓┃
┃  ↓1 2 3┃ ┃foo┃┃
┃  ┃4 5 6┃ ┗━━━┛┃
┃  ┗━━━━━┛      ┃
┗∊━━━━━━━━━━━━━━┛

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

      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'          

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

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

例如

]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/

问候,

文斯

⎕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

在线尝试!

除非我遗漏了某些东西,否则解释器不提供保存和重建任何可能类型的变量的机制(命名空间,对象,对这些变量的引用等很多复杂性)。 “序列化”可能最接近,但是(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生活中,我很少看到“不可行”的东西 - 但有时路径与你期望的不同(知道其他语言)......

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM