Błąd w definicji w Rakiecie

Właśnie odkryłem Racket kilka dni temu i staram się lepiej z nim współpracować, pisząc mały skrypt generujący obrazy reprezentujące kod źródłowy za pomocą#lang slideshow.

Wiem, że podczas programowania w paradygmacie funkcjonalnym dobrą praktyką jest tworzenie prawie wszystkich zmiennych za pomocąlet, ale uważam, że wprowadza zbyt wiele poziomów zagnieżdżania, a let Racket ma zbyt skomplikowane API, które wymaga zbędnych nawiasów. Jestem pewien, że ma to na celu usunięcie niejednoznaczności podczas używanialet w mocniejszy sposób, ale dla moich celów to tylko irytacja. W związku z tym tworzę wszystkie moje zmienne za pomocądefinei pisanie bloków za pomocąbegin jeśli muszę (np. w cieleif komunikat).

Problem polega na tym, że wielokrotnie otrzymywałem bardzo tajemnicze błędy. Jestem pewien, że popełniam jakiś głupi błąd początkującego, który jest nowy w tym języku, ale naprawdę nie mogę znaleźć źródła skargi.

Oto obraźliwy kod:

(define sub-code (foldr ht-append (rectangle 0 0) (map internal-style (rest code))))

chociaż to, co definiujemysub-code wydaje się być nieistotne. Jeśli go zastąpię

(define sub-code '())

Otrzymuję ten sam błąd. DrRacket tak mówidefine jest używany w kontekście wyrażenia. Rozumiem, co ten błąd normalnie oznaczałby - IE, które podniosłoby się podczas pisania kodu, jak(print (define x 10)), ale nie widzę, co by go tutaj uruchomiło.

Jeśli to pomoże, todefine jest na początkubegin blok, wewnątrzif komunikat

(if (list? code)
    (begin
        (define sub-code '())
        ; a few more define statements and finally an expression ))

Specyficzny komunikat o błędzie, który drukuje DrRacket

define: not allowed in an expression context in: (define sub-code (quote ()))

Myślałem, że możedefine nie jest dozwolonebegin bloki, ale sprawdziłemdoktorzy i jeden z przykładówbegin jest

(begin
    (define x 10)
    x)

Więc tak naprawdę nie wiem, co robić. Z góry dziękuję!

questionAnswers(4)

yourAnswerToTheQuestion