Ich habe gerade Racket vor ein paar Tagen entdeckt, und ich versuche, es bequemer zu bekommen, indem ich ein kleines Skript schreibe, das Bilder erzeugt, um den Quellcode mit #lang slideshow
darzustellen.Fehler beim Definieren im Racket
Ich weiß, dass es bei der Programmierung in einem funktionalen Paradigma praktisch ist, fast alle Variablen mit let
zu erstellen, aber ich finde, dass es zu viele Verschachtelungsebenen einführt und dass Racket's eine überkomplizierte API hat, die überflüssige Klammern benötigt. Ich bin mir sicher, dass dies die Mehrdeutigkeit bei der Verwendung von let
auf leistungsfähigere Weise zu entfernen, aber für meine Zwecke ist es nur ein Ärgernis. Folglich erstelle ich alle meine Variablen mit 10 und schreibe Blöcke mit begin
, wenn ich (wie im Körper einer if
Aussage) muss.
Das Problem ist, dass ich immer wieder scheinbar sehr mysteriöse Fehler bekommen habe. Ich bin mir sicher, ich mache nur einen dummen Anfängerfehler, bin neu in der Sprache, aber ich kann wirklich nicht die Quelle der Beschwerde finden.
Hier ist der problematischen Code:
(define sub-code (foldr ht-append (rectangle 0 0) (map internal-style (rest code))))
obwohl das, was wir definieren sub-code
zu scheint ziemlich irrelevant. Wenn ich es durch
ersetze, erhalte ich den gleichen Fehler. DrRacket sagt, dass in einem Ausdruck Kontext verwendet wird. Ich verstehe, was dieser Fehler normalerweise bedeuten würde - IE, dass es erhöhen würde, wenn Sie Code wie (print (define x 10))
schreiben, aber ich kann nicht sehen, was es hier auslösen würde.
Wenn es hilft, diese define
ist am Anfang eines begin
Block, in einer if
Anweisung
(if (list? code)
(begin
(define sub-code '())
; a few more define statements and finally an expression))
Die spezifische Fehlermeldung DrRacket ist Druck ist
define: not allowed in an expression context in: (define sub-code (quote()))
Ich dachte, vielleicht define
isn 't erlaubt in begin
Blöcke, aber ich überprüfte the docs und eines der Beispiele für begin
ist
(begin
(define x 10)
x)
Also ich weiß nicht wirklich was zu tun ist. Danke im Voraus!
Dank! Es endete mit "Let", aber es ist nützlich zu wissen, dass 'begin' implizit so aussehen kann. Meine Intuition war, dass '(begin foo)' nur eine Kurzschrift für '((lambda() foo))' wäre, aber ich denke, es ist komplizierter als das. – SelectricSimian