Bei " Pure Functional Programming" geht es in seiner formalen Definition um die Idee, Rechenmaschinen zu entwerfen, deren Ausgabe lediglich "eine Funktion der Eingabe in die Maschine" ist . Wenn Sie dieselbe Eingabe in die Maschine einspeisen, wird dieselbe Ausgabe erzeugt. Jede Eingabe wird explizit benannt, damit Sie genau wissen, welche Abhängigkeiten bestehen. Eine rein funktionale Programmiersprache setzt dies konsequent durch.
Doch ... in der Grundlinie "Rebol" können Sie Dinge schreiben wie:
foo: function [value [integer!]] [
either now/date = 20-Feb-2013 [
value + 1
] [
value
]
]
Hier sehen wir eine Funktion, die an jedem Tag, aber heute, ihre ganzzahlige Eingabe zurückgibt, wobei Sie den Wert plus eins erhalten. Es enthält eine unsichtbare Abhängigkeit vom Datum, die nicht formal als Argument für die Funktion angegeben ist. Es ist die Art von Dingen, die Haskell-Leute und Software-Formalisten wie mich dazu bringen, blutigen Mord zu schreien.
Daher ist Rebol nicht rein funktional aus dem Kasten heraus . (... aber lesen Sie weiter ...)
Die weniger strenge Definition der funktionalen Programmierung ist, wenn Funktionen als Werte in der Sprache fungieren können. So können Sie einer Variablen eine Funktion zuweisen und später verwenden. In diesem Sinne können Sie lesen, wie Javascript eine funktionale Sprache ist, und sehen, dass die heikle Definition einige Leute dazu bringen würde, zu sagen, dass Javascript eine funktionale Sprache ist. Wenn Sie mit der Definition so locker sein wollen, dann wäre dies "funktional":
>> foo: does [a + 10]
>> a: 20
>> print foo
== 30
(Hinweis: DOES ist eine Annehmlichkeit zum Definieren einer Funktion ohne Argumente, die nur einen Text enthält.)
Ich weiß nicht, ob ich das (oder JavaScript) für das halten würde, was ich als funktionale Programmierung bezeichne. YMMV.
Wenn Sie Zeit in der Informatik verbringen, lernen Sie Dinge wie Turing Tarpits und Berechenbarkeit sowie diese Art von Äquivalenzprinzipien kennen, bei denen "wenn Sie X mit Y verbinden können, dann ist Z wahr". Und genau wie Sie eine Haskell-Implementierung in C schreiben und sich dann darauf beschränken können, nur C-Aufrufe zu verwenden, die der Haskell-Bibliothek zugeordnet sind, können Sie behaupten, dass Sie "funktionale Programmierung" durchführen und technisch korrekt sind.
Wenn Sie also sagen möchten, dass Rebol auf funktionale Programmierstile ausgerichtet sein kann, könnten Sie ein Pessimist sein und sagen: " Nun, es ist nicht besser, als so zu tun, als würden Sie C machen, wenn Sie tatsächlich eine so begrenzte Teilmenge der Sprache verwenden, dass Sie." Verwenden Sie Haskell per Proxy " . Der Trick in Rebols Ärmel ist, wie leicht Sie von einem "Dialekt" -Paradigma zum anderen wechseln können. Das Schreiben einer kleinen domänenspezifischen Sprache, die zufällig funktionsfähig ist, ist so einfach und natürlich, dass es sich nicht so anfühlt, als würden Sie Ihre Sprache aus dem Gelenk verdrehen, um dies zu tun. Die Fähigkeit, domänenspezifische Sprachen mit funktionalem Charakter zu erstellen, führt dazu, dass Rebol als "paradigmenneutral" eingestuft wird .
Viele Leute verwechseln Rebol mit seinem gebräuchlichsten Dialekt (dem DO-Dialekt) und denken, "das ist Rebol". Aber Rebols "Essenz" ähnelt eher XML, es ist ein Datenaustauschformat, das zufällig (okay, nicht zufällig) hyperoptimierten Code enthält, der sich darauf konzentriert, ihn auf bestimmte Weise sofort zu verarbeiten. Eine gute Hintergrundinformation darüber, wie es XML übertrifft , finden Sie unter War XML von Anfang an fehlerhaft von Carl Sassenrath von AmigaOS (und jetzt Rebol).