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ądefine
i 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ę!