Để có được Phạm vi từ vựng chính xác và đóng cửa trong một thông dịch viên, tất cả các bạn cần làm là làm theo các quy tắc:
- Trong thông dịch viên của bạn, biến luôn nhìn lên trong một bảng môi trường thông qua vào bởi người gọi/được giữ như một biến số, không phải là một số env-stack toàn cầu. Đó là,
eval(expression, env) => value
.
- Khi mã được giải thích gọi một hàm, môi trường là NOT được chuyển cho hàm đó.
apply(function, arguments) => value
.
- Khi một hàm được diễn giải được gọi, môi trường mà nội dung của nó được đánh giá là môi trường trong đó định nghĩa hàm được tạo và không liên quan gì đến người gọi. Vì vậy, nếu bạn có hàm cục bộ, thì đó là một cấu trúc đóng, tức là cấu trúc dữ liệu chứa các trường
{function definition, env-at-definition-time}
.
Mở rộng trên rằng bit cuối cùng trong Python-ish cú pháp:
x = 1
return lambda y: x + y
được thực hiện như thể nó là
x = 1
return makeClosure(<AST for "lambda y: x + y">, {"x": x})
nơi đối số dict thứ hai có thể chỉ là hiện tại-env thay vì cấu trúc dữ liệu được xây dựng tại thời điểm đó. (Mặt khác, giữ lại toàn bộ env thay vì chỉ các biến đóng kín có thể gây rò rỉ bộ nhớ.)
Nguồn
2010-03-05 02:47:56
Bạn nên đọc * Bản thiết yếu của Ngôn ngữ lập trình * http://www.cs.indiana.edu/eopl/ –