簡體   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