2011-07-05 14 views

Trả lời

6

Không, không có điều nào trong R6RS. Một số triển khai hiếm hoi có thể hỗ trợ một số thứ như thế, nhưng trong đa số áp đảo (bao gồm cả eval bằng các ngôn ngữ khác!) Điều này không thể thực hiện được.

Lý do đơn giản: nó phá vỡ quá trình biên dịch, vì nó dẫn đến việc thực hiện hai chức năng phân biệt dựa trên tên địa phương và trong một số trường hợp cũng có thể cấm tối ưu hóa đơn giản. Ví dụ, nếu có một cái gì đó mà bạn có thể điền vào cho ??? của bạn sau đó trình biên dịch sẽ cần phải có hai bindings ngay cả khi họ có thể được tối ưu hóa đi. Trong những trường hợp hiếm hoi có thể, bất cứ điều gì được sử dụng trong ??? (trong một số ngôn ngữ chỉ sử dụng đơn giản là eval) kích hoạt một trình biên dịch khác, bản đồ hóa các ràng buộc đã biết với giá trị của chúng. (Có một số hành vi lạ với eval được đề cập theo nghĩa đen trong mã JS trong một số trình duyệt, đó là vấn đề tương tự.)

+0

Những ngôn ngữ khác có 'eval' hoạt động theo cách này? – amoe

+0

Giống như JS? Tôi không biết. –

+0

@amoe Ngôn ngữ lập trình hạt nhân sử dụng eval như vậy. – artemonster

2

Biến số không bao giờ là một phần của môi trường từ góc nhìn của eval. Vì vậy, không có cách nào cho eval để chạm vào các biến từ vựng xy, trong ví dụ của bạn.

Cập nhật: Kể từ Guile 2.0.5, bạn có thể sử dụng local-eval, điều này thực sự sẽ cho phép biểu thức eval của bạn sử dụng biến cục bộ (từ vựng). Nhưng như Eli nói, hầu hết các triển khai Đề án không hỗ trợ điều này.