Rebol - 69 oder 7475 voll konform mit allen Regeln
Neue Arbeitsversionen dank @rgchris! Nicht sicher, ob die erste Anforderung "Nicht auf die Quelle zugreifen" fehlschlägt, da der Interpreter den geladenen und analysierten Code enthält, der als cmd-Zeilenparameter im Systemobjekt ( system/options/do-arg) übergeben wurde, das verwendet wird, um sich selbst zu erkennen.
probe not any[error? i: try[load/all input]i = system/options/do-arg]
Dieser folgt allen Regeln:
do b:[i: input prin block? if i <> join "do b:" mold b [try [load/all i]]]
Anwendungsbeispiel:
Zuerst wird eine gültige Ganzzahl gedruckt, dann wird eine ungültige Ganzzahl gedruckt.
echo "rebol [] print 123" | rebol --do "probe not any[error? i: try[load/all input]i = system/options/do-arg]"
true
echo "rebol [] print 1w3" | rebol --do "probe not any[error? i: try[load/all input]i = system/options/do-arg]"
false
echo "probe not any[error? i: try[load/all input]i = system/options/do-arg]" | rebol --do "probe not any[error? i: try[load/all input]i = system/options/do-arg]"
false
Vollständig konforme Version:
echo 'rebol [] 123' |r3 --do 'do b:[i: input prin block? if i <> join "do b:" mold b [try [load/all i]]
true
echo 'rebol [] 123a' |r3 --do 'do b:[i: input prin block? if i <> join "do b:" mold b [try [load/all i]]]'
false
echo 'do b:[i: input prin block? if i <> join "do b:" mold b [try [load/all i]]]' |r3 --do 'do b:[i: input prin block? if i <> join "do b:" mold b [try [load/all i]]
false
Erläuterung:
Erste Version
Dies verwendet die in Rebols integrierte loadFunktion, um den Code von stdin zu analysieren und zu laden, führt ihn jedoch nicht aus.
Der tryBlock fängt alle Syntaxfehler ab und die error?Funktion konvertiert den Fehler in einen einfachen Booleschen Wert.
Das i = system/options/do-argvergleicht die Eingabe von stdin (zugewiesen an i) mit dem Code, der an das do-argArgument übergeben wurde (hinterhältig, aber sehr golf :).
anyist eine großartige Funktion, die zurückgibt, truewenn any-thing im Block ausgewertet wird true(zum Beispiel zurückgeben any [ false false true ]würde true).
notInvertiert dann einfach den Booleschen probeWert , um die richtige Antwort zu erhalten, und zeigt den Inhalt des zurückgegebenen Werts an.
Vollständig konforme Version
Lassen Sie uns dies der Reihe nach durchgehen ...
Weisen Sie das Wort bdem folgenden Block [] zu.
Verwenden Sie die doFunktion, um den doDialekt im bBlock zu interpretieren .
Innerhalb des bBlocks ...
Stellen Sie das Wort so ein i, dass es auf den Inhalt von stdin ( input) verweist .
Jetzt setzen ifwir joinden String "do b:" auf den mold'ed-Block bund er ist nicht gleich ( <>) für die stdin-Eingabe, idann versuchen wir loaddie Eingabe i.
Wenn das Ergebnis a ist block, haben wir loaddie übergebenen Daten korrekt bearbeitet, andernfalls würden wir eine nonevon den fehlgeschlagenen erhalten if.
Verwenden Sie prindiese Option , um das Ergebnis anzuzeigen, block?dessen Wert true zurückgibt, wenn das Ergebnis ein Block ist. Wenn Sie prinim Gegensatz zu printverwenden, wird nach der Ausgabe kein Wagenrücklauf angezeigt (und es wird ein weiteres Zeichen gespeichert).