2017-05-29 2 views
2

Wie konvertiert man einen Dyalog APL-Wert in einen Zeichenvektor, der an übergeben werden könnte, um den gleichen Wert zu erhalten?"APL Object Notation" in Dyalog APL

Wie dies erwartet wird wie folgt aussehen:

 x←2 3⍴⍳6 
     x←1,⊂x 
     x←x,⊂'foo' 
     y←desired_function x 
     DPX y 
┌→─────────────────┐ 
│1,(⊂2 3⍴⍳6),⊂'foo'│ 
└──────────────────┘ 
     x≡⍎y 
1 

aktualisieren

Die Idee ist, einen Wert an einen Menschen bearbeitbare APL-Quellcode umwandeln können, um es auf eine Einheit zum Einfügen Testfunktion, wenn ein neues problematisches Szenario gefunden wurde. Ich möchte, dass diese Testszenarien im APL-Quellcode vorliegen, nicht in Dateien, da in einem Framework, mit dem ich arbeite, Quellcode von einem Versionskontrollsystem gut verwaltet wird, während Dateien nicht funktionieren. Und ich möchte, dass es editierbar und nicht nur serialisiert wird, um bestehende Testszenarien zu verbessern, wenn sich Argumente/Ergebnisse ändern.

Antwort

0

Nicht sicher über Dyalog APL, aber die meisten anderen APLs haben eingebaute Funktionen zu erreichen, dass.

In IBM APL2 (und damit auch in GNU APL) Sie 2 ⎕TF zu konvertieren zwischen einem Wert (eigentlich eine Variable mit diesem Wert) verwenden können, und APL-Code, den es produziert (wenn auch nicht über aber über eine andere 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┃ ┗━━━┛┃ 
┃ ┗━━━━━┛  ┃ 
┗∊━━━━━━━━━━━━━━┛ 

In GNU APL können Sie auch 10 ⎕CR zu diesem Zweck verwenden. Das Ergebnis besteht aus mehreren Aussagen APL, so dass Sie ⍎¨ über das Ergebnis haben:

 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

Es sei denn, ich bin etwas fehlt, ist der Dolmetscher nicht einen Mechanismus zu tun speichern & Wiederaufbau jede mögliche Art von Variable (es gibt eine Menge Komplexität mit Namespaces, Objekten, Referenzen zu irgendwelchen von diesen usw.). "Serialisierung" mag am nächsten kommen, aber (a) es ist nicht menschenlesbar und (b) es ist mehr ein Interpreter-Mechanismus als ein Werkzeug für Anwendungsentwickler, also möchte ich nicht einmal darüber reden - es gibt bessere Wege zu behandeln, dass;)

es besteht jedoch ein Benutzerbefehl, mit dem Sie das tun können:

]save (Object) (Filename) 

so

]save x h:\temp\x 

speicherte es auf eine Unicode-Datei h: \ temp \ x.dyalog, das auch mit jedem Unicode-fähigen Editor bearbeitet werden kann (oder sogar editiert) h: \ temp \ x.dyalog) .

von

]load h:\temp\x 

tun können Sie das Objekt in den Arbeitsbereich laden. Alternativ verwenden

]xyz←load h:\temp\x -noname 

den Wert xyz anstelle von Laden in x wieder zuzuordnen.

Und es gibt mehr ... Ich nehme an, dass Ihre Frage das Ergebnis der Fähigkeit ist, einige Daten reproduzieren zu können. Ist Ihnen das "Component File System" bekannt, das eine einfache Möglichkeit bietet, Variablen wie x in Dateien zu speichern und von dort neu zu laden? Beispiel:

{x ⎕fappend ⍵ ⋄ ⎕FUNTIE ⍵}'h:\temp\x'⎕FCREATE 0 

x zu speichern und dann

{r←⎕fread ⍵,1 ⋄ ⎕FUNTIE ⍵ ⋄ r}'h:\temp\x'⎕FTIE 0 

es wieder zu lesen. (Disclaimer: Diese Beispiele sind zu simpel, weil es keine Fehlerbehandlung gibt, falls die Datei, die Sie erstellen, bereits existiert, etc.). In der Regel muss dafür gesorgt werden, aber das wäre zu viel Ablenkung gewesen kleine Probe ...)

So, endlich denke ich, ist meine wirkliche Sorge über den Kontext dieses Problems und den Zweck, den Sie versuchen zu erreichen. In meinem gesamten APL-Leben habe ich selten Dinge gesehen, die "nicht machbar" waren - aber manchmal ist der Weg anders als das, was man erwarten würde (andere Sprachen zu wissen) ...

1

Ich weiß nicht, ob es da ist ein Weg, dies mit ⍎ zu tun, aber ich werde erwähnen, dass Dyalog Version 15.0 2 I-Beams zum Serialisieren und Deserialisieren hat.

http://help.dyalog.com/15.0/Content/Language/Primitive%20Operators/Serialise%20Array.htm

z.B.

]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 

Auch, können Sie gerne unserem Forum beitreten, wie Sie mehr Dyalog APL Nutzer erreichen, wenn Sie Ihre Frage dort stellen.

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

Grüße,

Vince

+0

Vielen Dank für die Informationen, aber die Idee ist, einen Wert an einen Menschen bearbeitbare APL-Quellcode umwandeln zu können einfügen es zu einer Komponententestfunktion, wenn ein neues problematisches Szenario gefunden wurde. Ich möchte, dass diese Testszenarien im APL-Quellcode vorliegen, nicht in Dateien, da in einem Framework, mit dem ich arbeite, Quellcode von einem Versionskontrollsystem gut verwaltet wird, während Dateien nicht funktionieren. Und ich möchte, dass es editierbar und nicht nur serialisiert wird, um bestehende Testszenarien zu verbessern, wenn sich Argumente/Ergebnisse ändern. Gibt es einen I-Beam, um irgendeine Art von Serialisierung in APL-Quellcode umzuwandeln? – Olexa

+0

Bitte beachten Sie, dass die von mir vorgeschlagene Save-Lösung die Ausdrücke in Unicode-Dateien schreibt, die von Versionskontrollsystemen verwaltet werden können. # – MBaas

3

Meiner Meinung nach, Execute & "Überweisungsformular" sind nicht die optimale Lösung für eine Reihe von Gründen:

  • Komplexe Strukturen schnell schwierig zu lesen
  • Execute ist ein relativ schweres/i Tool zum Aufrufen, vergleichen mit anderen Lösungen
  • Wenn Sie nicht aufpassen, öffnen Sie sich selbst für "injection" -Angriffe, bösartigen Code in Dateien, die Konstanten enthalten sollen, aber ausgeführt werden, wenn Ihre Anwendung gestartet wird.

Je nachdem, was Ihre Daten aussieht, JSON könnte ein schöner Weg zu gehen - es ist ein Format, nur für diese entworfen:

In Dyalog 15,0:

 fromJSON←7159⌶ ⋄ toJSON←7160⌶ 
     (namespace←⎕NS '').life←42 
     toJSON (⍳4) 'Hello' namespace 
[[1,2,3,4],"Hello",{"life":42}] 

Der Nachteil JSON ist, dass es keine höherdimensionalen Arrays darstellen kann. So müssen Sie die Dinge ein wenig massieren, wenn Sie Matrizen benötigen:

 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 

In der Version 16.0, am Ende dieses Monats veröffentlicht werden, die experimentellen I-Träger haben eine Systemfunktion ⎕JSON werden.

0

⎕SE.Dyalog.Utils.repObj

Zum Beispiel:

 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!