如何将任何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源代码中,而不是在文件中,因为在我使用的框架中,源代码由版本控制系统很好地管理,而文件则不是。我希望它是人类可编辑的,而不仅仅是序列化的,以便在参数/结果发生变化时更容易修改现有的测试场景。
答案 0 :(得分:3)
在我看来,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用户。
此致
文斯
答案 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
答案 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生活中,我很少看到那些不可行的东西" - 但有时路径不同于你所期望的(了解其他语言)......