【问题标题】:"APL Object Notation" in Dyalog APLDyalog APL 中的“APL 对象表示法”
【发布时间】:2017-10-29 19:09:47
【问题描述】:

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

【问题讨论】:

    标签: apl dyalog


    【解决方案1】:

    不确定 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'          
    

    【讨论】:

      【解决方案2】:

      除非我遗漏了什么,否则解释器不提供一种机制来保存和重建任何可能的变量类型(命名空间、对象、对任何这些的引用等都非常复杂.)。 “序列化”可能是最接近的,但是(a)它不是人类可读的,(b)它更像是一种解释器机制而不是应用程序开发人员的工具,所以我什至不想进一步谈论它 - 有更好的方法处理那个;)

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

      ]save (Object) (Filename)
      

      所以

      ]save x h:\temp\x
      

      将其保存到一个 unicode 文件 h:\temp\x.dyalog 中,也可以使用任何支持 Unicode 的编辑器(甚至 )edit 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 生活中,我很少看到“不可行”的事情 - 但有时路径与您所期望的不同(了解其他语言)......

      【讨论】:

        【解决方案3】:

        我不知道是否有办法用 ⍎ 做到这一点,但我会提到 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 用户。

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

        问候,

        文斯

        【讨论】:

        • 感谢您提供的信息,但我们的想法是将值转换为人工可编辑的 APL 源代码,以便在发现新的问题场景时能够将其插入到单元测试函数中.我希望这些测试场景在 APL 源代码中,而不是在文件中,因为在我使用的框架中,源代码由版本控制系统很好地管理,而文件不是。而且我希望它是人工可编辑的,而不仅仅是序列化的,以便在参数/结果发生变化时更容易修改现有的测试场景。是否有 I-Beam 可以将任何形式的序列化转换为 APL 源代码?
        • 请注意,我建议的 ]save-solution 会将表达式写入 unicode 文件,这些文件当然可以由版本控制系统管理。#
        【解决方案4】:

        在我看来,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。

        【讨论】:

          【解决方案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
          

          Try it online!

          【讨论】:

            猜你喜欢
            • 2017-05-03
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2017-08-14
            • 2022-01-27
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多