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 load
Funktion, um den Code von stdin zu analysieren und zu laden, führt ihn jedoch nicht aus.
Der try
Block fängt alle Syntaxfehler ab und die error?
Funktion konvertiert den Fehler in einen einfachen Booleschen Wert.
Das i = system/options/do-arg
vergleicht die Eingabe von stdin (zugewiesen an i
) mit dem Code, der an das do-arg
Argument übergeben wurde (hinterhältig, aber sehr golf :).
any
ist eine großartige Funktion, die zurückgibt, true
wenn any
-thing im Block ausgewertet wird true
(zum Beispiel zurückgeben any [ false false true ]
würde true
).
not
Invertiert dann einfach den Booleschen probe
Wert , 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 b
dem folgenden Block [] zu.
Verwenden Sie die do
Funktion, um den do
Dialekt im b
Block zu interpretieren .
Innerhalb des b
Blocks ...
Stellen Sie das Wort so ein i
, dass es auf den Inhalt von stdin ( input
) verweist .
Jetzt setzen if
wir join
den String "do b:" auf den mold
'ed-Block b
und er ist nicht gleich ( <>
) für die stdin-Eingabe, i
dann versuchen wir load
die Eingabe i
.
Wenn das Ergebnis a ist block
, haben wir load
die übergebenen Daten korrekt bearbeitet, andernfalls würden wir eine none
von den fehlgeschlagenen erhalten if
.
Verwenden Sie prin
diese Option , um das Ergebnis anzuzeigen, block?
dessen Wert true zurückgibt, wenn das Ergebnis ein Block ist. Wenn Sie prin
im Gegensatz zu print
verwenden, wird nach der Ausgabe kein Wagenrücklauf angezeigt (und es wird ein weiteres Zeichen gespeichert).