2017-05-29 34 views
2

如何將任何Dyalog APL值轉換爲可傳遞給以獲得相同值的字符向量?Drayog中的「APL對象表示法」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

不能確定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'   
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生活中,我很少看到那些「不可行」的東西 - 但有時候路徑與你期望的不同(知道其他語言)...

1

我不知道是否有用⍎來做到這一點,但我會提到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/

問候,

文斯

+0

謝謝你的信息,但這個想法是一個值轉換爲人類可編輯的APL源代碼,能夠插入它發現一個單元測試功能,當發現一個新的有問題的場景。我希望這些測試場景是在APL源代碼中,而不是在文件中,因爲在我使用的框架中,源代碼由版本控制系統很好地管理,而文件則不是。我希望它是人爲編輯的,而不僅僅是序列化的,以便在參數/結果改變時更容易修改現有的測試場景。是否有I-Beam將任何形式的序列化轉換爲APL源代碼? – Olexa

+0

請注意,我建議的保存解決方案將表達式寫入unicode文件,這些文件當然可以由版本控制系統進行管理。 – MBaas

3

在我看來,執行& 「轉讓表格」 不是最佳的解決方案,對於一些原因:

  • 複雜的結構迅速變得難以閱讀
  • 執行是一個比較沉重/我調用的低效工具,與其他解決方案進行比較
  • 如果您不小心,請打開自己的「注入」攻擊,即在應用程序啓動時應該包含常量但正在執行的文件中的惡意代碼。

取決於你的數據的模樣,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版本,在這個月底被釋放,實驗工字梁已成爲系統功能⎕JSON。

0

⎕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!