Eine Reihe von "Paradigmen" sind im Laufe der Jahre in Mode gekommen: strukturierte Programmierung, objektorientiert, funktional, etc. Mehr wird kommen.
Auch wenn ein Paradigma nicht mehr in Mode ist, kann es immer noch gut darin sein, die speziellen Probleme zu lösen, die es zuerst populär gemacht haben.
So zum Beispiel mit OOP für eine GUI ist immer noch natürlich. (Die meisten GUI-Frameworks haben eine Reihe von Zuständen, die durch Nachrichten/Ereignisse modifiziert wurden.)
Racket ist Multi-Paradigma. Es hat ein class
System. Ich verwende es selten, , aber es ist verfügbar, wenn ein OO-Ansatz für das Problem sinnvoll ist. Common Lisp hat Multimethoden und CLOS. Clojure hat Multimethoden und Java Klassen Interop.
Und trotzdem, Grund Stateful OOP ~ = eine Variable in einem Verschluss mutiert:
#lang racket
;; My First Little Object
(define obj
(let ([val #f])
(match-lambda*
[(list) val]
[(list 'double) (set! val (* 2 val))]
[(list v) (set! val v)])))
obj ;#<procedure:obj>
(obj) ;#f
(obj 42)
(obj) ;42
(obj 'double)
(obj) ;84
Ist das ein großes Objekt-System? Nein. Aber es hilft Ihnen zu sehen, dass die Essenz von OOP den Zustand mit Funktionen kapselt, die ihn modifizieren. Und Sie können dies in Lisp leicht tun.
Was ich immer an: Ich glaube nicht, Lisp verwendet, ist über „anti-OOP“ oder „pro-funktional“ zu sein. Stattdessen ist es eine großartige Möglichkeit, mit den Grundbausteinen der Programmierung zu spielen (und in der Produktion zu verwenden). Sie können verschiedene Paradigmen erkunden. Sie können mit Ideen wie "Code ist Daten und umgekehrt" experimentieren.
Ich sehe Lisp nicht als eine Art spirituelle Erfahrung. Höchstens ist es wie Zen, und Satori ist die Erkenntnis, dass all diese Paradigmen nur verschiedene Seiten derselben Medaille sind. Sie sind alle wundervoll, und sie alle saugen. Das Paradigma, das auf die Lösung hinweist, ist nicht die Lösung. Blah bla bla.:)
Mein praktischer Rat ist, es klingt wie Sie Ihre Erfahrung mit funktionaler Programmierung abrunden möchten. Wenn Sie das zum ersten Mal an einem großen Projekt machen müssen, ist das eine Herausforderung. Versuchen Sie in diesem Fall, Ihr Programm in Stücke zu zerlegen, die "Status beibehalten" vs. "Dinge berechnen". In letzterem können Sie versuchen, sich auf "mehr Funktionalität" zu konzentrieren. Suchen Sie nach Möglichkeiten, um reine Funktionen zu schreiben. Kette sie zusammen. Erfahren Sie, wie Sie Funktionen höherer Ordnung verwenden. Und schließlich, verbinden Sie sie mit dem Rest Ihrer Anwendung - die weiterhin Stateful und OOP und Imperativ sein kann. Das ist in Ordnung, für jetzt und vielleicht für immer.
Hier ist eine interessante Lektüre, warum Designmuster in Lisp-ähnlichen Sprachen weniger verbreitet sind als in anderen Sprachen: http://norvig.com/design-patterns/ – uselpa
Eine Methode besteht darin, einfach von oben nach unten zu schreiben und vorausgesetzt, Sie haben Funktionen, die das tun, was Sie wollen. Sobald Sie das Problem als eine Art Berechnung definiert haben, fallen mehr funktionale Idiome heraus. – WorBlux