Właśnie odkryłem Racket kilka dni temu i staram się go bardziej komfortowo napisać mały skrypt generujący obrazy do reprezentowania kodu źródłowego przy użyciu #lang slideshow
.Błąd z definiowaniem w Rakiecie
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 zawikłany interfejs API, który wymaga zbędnych nawiasów. Jestem pewien, że to ma na celu usunięcie niejednoznaczności podczas korzystania z let
w bardziej potężny sposób, ale dla moich celów jest to po prostu irytacja. Dlatego tworzę wszystkie zmienne z define
i piszę bloki z begin
, jeśli muszę (np. W treści instrukcji if
).
Problem polega na tym, że wielokrotnie otrzymywałem bardzo tajemnicze błędy. Jestem pewien, że właśnie popełniłem błąd głupiego początkującego, będąc nowym językiem, ale naprawdę nie mogę znaleźć źródła skargi.
Oto kod naruszającym przepisy:
(define sub-code (foldr ht-append (rectangle 0 0) (map internal-style (rest code))))
chociaż co mamy do definiowania sub-code
Wygląda całkiem nieistotne. Jeśli wymienię go na
(define sub-code '())
Otrzymuję ten sam błąd. DrRacket mówi, że define
jest używany w kontekście wyrażenia. Rozumiem, co ten błąd miałby normalnie oznaczać - IE, który podnosiłby, gdy piszesz kod taki jak (print (define x 10))
, ale nie widzę, co by go tutaj wyzwoliło.
Jeśli to pomoże, to define
jest na początku begin
bloku, wewnątrz instrukcji if
(if (list? code)
(begin
(define sub-code '())
; a few more define statements and finally an expression))
konkretnym komunikatem o błędzie DrRacket drukowania jest
define: not allowed in an expression context in: (define sub-code (quote()))
Myślałem, że może define
ISN 't dozwolone w blokach begin
, ale sprawdziłem the docs i jeden z przykładów dla begin
jest
(begin
(define x 10)
x)
Tak naprawdę nie wiem co robić. Z góry dziękuję!
Dzięki! Skończyło się na używaniu 'let', ale przydaje się wiedza, że' begin' może tak automatycznie przekształcać. Moja intuicja polegała na tym, że '(begin foo)' będzie skrótem dla '((lambda() foo))', ale myślę, że to jest bardziej skomplikowane. – SelectricSimian