Mục đích chính của *read-eval*
là cho phép người đọc đánh giá biểu thức ở thời gian đọc, thường là đối với nội dung không có ký hiệu chữ. Nếu *read-eval*
là true (mặc định), read
và read-string
sẽ đánh giá biểu thức sau # =. Bạn có thể thấy cách tính năng được sử dụng khi *print-dup*
bị ràng buộc là true - nghĩa là bạn muốn các giá trị in theo cách mà các kiểu chính xác của chúng được giữ nguyên, trong trường hợp này bạn sẽ thấy một số giá trị in với ký hiệu # =. Giá trị mặc định cho *print-dup*
là sai - đối với hầu hết mọi thứ, ký hiệu Clojure chuẩn là tốt. Ví dụ, chúng ta thường không quan tâm đến sự khác biệt giữa số nguyên và thời gian dài.
Tính năng *read-eval*
hữu ích khi tải mã, nhưng nó tạo ra nguy cơ bảo mật khi được sử dụng với đầu vào không tin cậy. Lời khuyên thông thường trước Clojure 1.5 là ràng buộc *read-eval*
sai khi xử lý đầu vào của người dùng. Tuy nhiên, vẫn còn một số vấn đề với việc đọc các đối tượng Java có thể gây ra vấn đề. Đó là cố định trong Clojure 1.5. Quan trọng hơn, Clojure 1.5 được giới thiệu, clojure.edn/read
và clojure.edn/read-string
không hỗ trợ bất kỳ tính năng nào trong số các tính năng *read-eval*
. Chúng an toàn cho việc đọc đầu vào của người dùng đại diện cho các giá trị Clojure thông thường như được định nghĩa bởi định dạng EDN. Xem http://edn-format.org để biết thêm thông tin.
Cảm ơn bạn đã giải thích @dAni! Nó rất hữu ích. – murtaza52
'eval' sẽ gây nhầm lẫn cho mọi người. Vấn đề là biểu thức sau khi # = được đánh giá khi '* read-eval *' là đúng. Không cần sử dụng eval. – miner49r