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:
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?: -)
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.
Ein altes, altes Idiom, das so etwas wie den ternären Operator ? :
von C machte und ein Ergebnis zurückgab, war das Folgende:
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.
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:
oder
%Vor%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:
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.
Tags und Links functional-programming conditional-operator apl