Có các ngôn ngữ mà phạm vi được xác định theo cách không mở rộng đến các chức năng được đính kèm không? Nói cách khác là có một ngôn ngữ mà một mã như sau (cú pháp Python-like):Có ngôn ngữ lập trình không có biến toàn cầu không?
>>> x = 3
>>> def fact(n):
... print x
... return reduce(lambda u, v: u*v, xrange(1, n+1), 1)
...
sẽ đưa ra một lỗi vì x không được định nghĩa bên trong hàm fact
?
Nói chung, có các ngôn ngữ có phạm vi bất kỳ chức năng nào sẽ không bao gồm các hàm được xác định trong đó không?
Chỉnh sửa: Cảm ơn các nhận xét thông tin. Lý do tôi nghĩ về việc này là tình hình của một chức năng nội bộ có quyền truy cập vào tất cả các môi trường được cung cấp bởi các chức năng chứa của nó nghe có vẻ đáng ngờ gần gũi với tôi với tình hình được mô tả bởi Joe Armstrong trong mình argument against OOP:
Bởi vì vấn đề với ngôn ngữ hướng đối tượng là họ đã có tất cả môi trường tiềm ẩn này mà họ mang theo bên mình. Bạn muốn một quả chuối nhưng những gì bạn nhận được là một con khỉ đột giữ chuối và toàn bộ khu rừng.
Cũng có liên quan là tôi nghe rằng ngôn ngữ Newspeak không có không gian tên chung, mặc dù tôi không biết nó hoạt động như thế nào.
Tôi có thể tưởng tượng vấn đề, được nêu trong nhận xét của Brian dưới đây, các chức năng tích hợp (chức năng được nhập từ __builtins__
trong Pythonspeak hoặc Hệ thống bằng nhiều ngôn ngữ khác) được trình biên dịch/trình biên dịch giới thiệu trong mọi chức năng. Sau khi tất cả họ hầu như luôn luôn được đối xử đặc biệt trong ngôn ngữ ở nơi đầu tiên. Một tùy chọn khác là đặt chúng dưới dạng các phương thức của một đối tượng được truyền như một tham số cho hàm hoặc được nhập dưới dạng một mô-đun từ bên trong.
Điều gì sẽ thực hiện được? – Blindy
Lưu ý rằng 'in',' reduce' và 'xrange' cũng xuất hiện là số nhận dạng được giải quyết từ một số phạm vi bên ngoài. Điều này cho thấy lý do tại sao điều này hiếm khi hữu ích. – Brian