5 回答
⎕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
在我看来,Execute & "transfer form" 并不是最优的解决方案,原因有很多:
- 复杂的结构很快变得难以阅读
- 与其他解决方案相比,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 版本 15.0 有 2 个 I-Beam 用于序列化和反序列化。
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 用户。
问候,
文斯
除非我遗漏了什么,否则解释器不提供保存和重建任何可能类型的变量的机制(命名空间、对象、对这些变量的引用等都非常复杂)。“序列化”可能是最接近的,但是(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 生活中,我很少看到“不可行”的事情——但有时路径与你所期望的不同(了解其他语言)......