Bedingte Funktion in APL

7

Gibt es in einem der APL-Dialekte ein Symbol oder ein bekanntes Idiom für die bedingte Funktion?

Ich bin mir sicher, dass ich etwas vermisse, weil es so ein grundlegendes Sprachelement ist. In anderen Sprachen heißt es bedingter Operator , aber ich werde diesen Begriff hier vermeiden, weil ein APL-Operator etwas ganz anderes ist.

Zum Beispiel haben C und Freunde x ? T : F
LISPs haben (if x T F)
Python hat T if x else F
und so weiter.

Ich weiß, dass moderne APLs :If und Freunde haben, aber sie sind Imperativanweisungen, um den Programmfluss zu steuern: Sie geben keinen Wert zurück, können nicht in einem Ausdruck verwendet werden und können nicht auf boolesche Arrays angewendet werden. Sie haben einen ganz anderen Zweck, was bei mir in Ordnung ist.

Der einzige vernünftige Ausdruck, den ich mir für eine funktionale Auswahl ausdenken könnte, ist (F T)[⎕IO+x] , was für mich nicht besonders stumpf oder lesbar aussieht, obwohl es die Aufgabe auch für Arrays erledigt:

%Vor%

Ich habe versucht, einen ähnlichen Ausdruck mit Hilfe von Squad zu erstellen, bin aber auf Arrays von Booleans kläglich gescheitert. Selbst wenn ich könnte, müsste es immer noch ⎕IO oder eine fest codierte 1 einbetten, was in Bezug auf die Lesbarkeit noch schlimmer ist.

Bevor ich weitermache und mein eigenes if definiere und es für jedes Programm benutze, das ich jemals schreiben werde, gibt es irgendeinen Kanon dazu? Fehle ich eine offensichtliche Funktion oder einen Operator?

(Gibt es APL-Programmierer auf SO?: -)

    
Tobia 01.04.2013, 22:16
quelle

6 Antworten

8

Ja, es gibt APL-Programmierer auf SO (aber nicht viele!).

Ich denke, die Antwort ist, dass es dafür keinen Standard gibt.

Für eine skalare Lösung benutze ich "pick":

%Vor%

Während ich für ein boolesches Array die Indizierung verwende, wie oben:

%Vor%

Ich benutze immer den Nullpunkt des Indexursprungs, es ist also nicht nötig, 1 hinzuzufügen, und die Parens werden nicht benötigt.

Wenn diese nicht einfach genug sind, müssen Sie sie mit einer Funktion namens "if" abdecken. Das lässt Sie auch das Wahre und Falsche in die vielleicht natürlichere Ordnung von t f setzen.

    
Paul Mansour 02.04.2013, 15:31
quelle
8

Das Problem mit diesen:

%Vor%

ist, dass sowohl t als auch f ausgewertet werden.

Wenn du das Ding kurzschließen willst, kannst du Wächter benutzen:

%Vor%

Dies entspricht

%Vor%

in einer C-ähnlichen Sprache.

    
ngn 08.04.2013 20:04
quelle
2

Ein altes, altes Idiom, das so etwas wie den ternären Operator ? : von C machte und ein Ergebnis zurückgab, war das Folgende:

%Vor%

Beachten Sie, dass dies für Ursprung 0 geschrieben ist und die Parens um die -3 3 sind für die Klarheit da.

x = 42 ergibt null oder eins, abhängig von dieser Antwort wählen wir -3 oder 3 und wählen und führen so entweder die ersten 3 Elemente ("6x8") oder die letzten 3 Elemente ("6x7") der Kette aus . Der Diamant ⋄ ist nur zur Dekoration da.

Es ist unnötig zu sagen, dass man diesen Code wahrscheinlich nicht codieren würde, wenn man hätte: if: else available, obwohl die Kontrollstrukturform kein Ergebnis zurückgeben würde.

    
Lobachevsky 30.10.2013 12:51
quelle
2

In Dyalog APL können Sie verwenden:

%Vor%

Die Idee ist, (linkes Heftzwischenstück - das immer das linke Argument zurückgibt, während das rechte Argument verworfen wird) entweder 0 (für falsch) oder 1 (für wahre) Male - für das rechte Argument anzuwenden. Wenn es 0 Mal angewendet wird (d. H. Überhaupt nicht), wird das rechte Argument unverändert zurückgegeben, aber wenn es einmal angewendet wird, wird das linke Argument angewendet. Zum Beispiel:

%Vor%

oder

%Vor%     
Adám 06.09.2015 17:30
quelle
0

Dies ist eine häufige Frage. Ich denke, der Grund, warum es keine Standardantwort darauf gibt, ist, dass es für die Dinge, die Sie mit APL machen, eigentlich weniger nötig ist als für andere Sprachen.

Das heißt, es wird manchmal benötigt, und die Art, wie ich einen IFELSE -Operator in GNU APL implementiere, benutzt diese Funktion:

%Vor%

Die Funktion kann wie folgt aufgerufen werden:

%Vor%

Diese spezielle Implementierung übergibt das linke Argument als an die Klausel, weil das manchmal nützlich sein kann. Ohne ein linkes Argument wird es in übergeben.

    
Elias Mårtenson 23.09.2015 04:44
quelle
0

Der APL-Ausdruck:

%Vor%

sollte das C-Äquivalent für

sein %Vor%

Und alle anderen

%Vor%

für

%Vor%

usw. Im Allgemeinen, wenn a b c Ausdrücke der jeweiligen Sprachen sind, lautet der APL-Ausdruck:

%Vor%

Es sollte der Sprache C entsprechen:

%Vor%     
RosLuP 07.12.2017 08:42
quelle