Vì vậy, tôi biết rằng trong Đề án xác định là dành cho Phạm vi năng động và để cho Phạm vi tĩnh, tuy nhiên điều sau confuses me:Scheme phạm trù (xác định và để cho)
Nếu tôi có
(let ((x 0))
(define f (lambda() x))
(display (f))
(let ((x 1))
(display (f))
)
)
Nó sẽ hiển thị 00. Cho đến nay rất tốt. Tuy nhiên, nếu tôi thêm xác định bổ sung cho x như vậy:
(let ((x 0))
(define f (lambda() x))
(display (f))
(define x 4)
(let ((x 1))
(display (f))
)
)
Nó sẽ hiển thị undefined4. Tại sao điều này? Tại sao xác định x sau khi đánh giá f ảnh hưởng đến giá trị trả lại của (f)? Và tại sao giá trị trả về "không xác định"?
Nó cũng đáng nói đến là ràng buộc f với letrec thay vì xác định cũng sẽ làm việc:
(let ((x 0))
(letrec ((f (lambda() x)))
(display (f))
(define x 4)
(let ((x 1))
(display (f))
)
)
)
Returns 00.
Lưu ý: Tôi đã sử dụng DrRacket với languge đặt trên "Pretty Big"
Ý anh là gì bởi "xác định được cho Phạm vi năng động trong Đề án"? BTW, trừ khi bạn được yêu cầu sử dụng nó cho một khóa học, "Pretty Big" là một phương ngữ lỗi thời. – Rhangaun
Đề án luôn sử dụng phạm vi tĩnh, không chính xác để nói rằng "xác định là động và để cho phạm vi tĩnh" –
Tôi đồng ý với Oscar: tiền đề trong câu hỏi là sai hoặc đang sử dụng sai cụm từ. – dyoo