Tôi vừa phát hiện ra Racket cách đây vài ngày và tôi đang cố gắng thoải mái hơn bằng cách viết một tập lệnh nhỏ để tạo hình ảnh đại diện cho mã nguồn sử dụng #lang slideshow
.Lỗi khi xác định trong Racket
Tôi biết rằng khi lập trình trong một mô hình chức năng, bạn nên tạo hầu như tất cả các biến của mình với let
, nhưng tôi thấy rằng nó giới thiệu quá nhiều mức lồng nhau và Racket cho phép có một API quá phức tạp đòi hỏi các dấu ngoặc đơn thừa. Tôi chắc chắn điều này là để loại bỏ sự mơ hồ khi sử dụng let
theo những cách mạnh mẽ hơn, nhưng vì mục đích của tôi, nó chỉ là một sự khó chịu. Do đó, tôi đang tạo tất cả các biến của mình với define
và viết các khối với begin
nếu tôi cần (chẳng hạn như trong phần nội dung của câu lệnh if
).
Vấn đề là tôi đã nhiều lần nhận được những gì dường như là lỗi rất bí ẩn. Tôi chắc rằng tôi chỉ đang mắc phải một số sai lầm của người mới bắt đầu ngớ ngẩn, mới làm quen với ngôn ngữ, nhưng tôi thực sự không thể tìm ra nguồn gốc của đơn khiếu nại.
Dưới đây là mã vi phạm:
(define sub-code (foldr ht-append (rectangle 0 0) (map internal-style (rest code))))
mặc dù gì chúng tôi đang xác định sub-code
để có vẻ khá thích hợp. Nếu tôi thay thế bằng
(define sub-code '())
Tôi nhận được lỗi tương tự. DrRacket đang nói rằng define
đang được sử dụng trong ngữ cảnh biểu thức. Tôi hiểu những gì lỗi này thường có nghĩa là - IE rằng nó sẽ tăng lên khi bạn viết mã như (print (define x 10))
, nhưng tôi không thể nhìn thấy những gì sẽ kích hoạt nó ở đây.
Nếu nó giúp, define
đây là lúc bắt đầu của một khối begin
, bên trong một tuyên bố if
(if (list? code)
(begin
(define sub-code '())
; a few more define statements and finally an expression))
Các DrRacket thông báo lỗi cụ thể là in ấn là
define: not allowed in an expression context in: (define sub-code (quote()))
Tôi nghĩ có lẽ define
isn không được phép trong các khối begin
nhưng tôi đã kiểm tra the docs và một trong các ví dụ cho begin
là
(begin
(define x 10)
x)
Vì vậy, tôi thực sự không biết phải làm gì. Cảm ơn trước!
Cảm ơn! Kết thúc bằng việc chỉ với 'let', nhưng nó rất hữu ích khi biết rằng' bắt đầu' có thể biến dạng hoàn toàn như thế. Trực giác của tôi là '(bắt đầu foo)' sẽ chỉ là viết tắt của '((lambda() foo))', nhưng tôi đoán nó phức tạp hơn thế. – SelectricSimian