OK. Tôi đã được tinkering với Clojure và tôi liên tục chạy vào cùng một vấn đề. Chúng ta hãy xem đoạn này ít mã:Xác định lại biến số let'd trong vòng lặp Clojure
(let [x 128]
(while (> x 1)
(do
(println x)
(def x (/ x 2)))))
Bây giờ tôi hy vọng điều này để in ra một chuỗi bắt đầu với 128 như vậy:
128
64
32
16
8
4
2
Thay vào đó, nó là một vòng lặp vô hạn, in 128 hơn và hơn. Rõ ràng tác dụng phụ dự định của tôi không hoạt động.
Vậy làm cách nào để tôi xác định lại giá trị của x trong một vòng lặp như thế này? Tôi nhận ra điều này có thể không phải là Lisp (tôi có thể sử dụng một chức năng ẩn danh mà tự mình tái hiện, có lẽ), nhưng nếu tôi không tìm ra cách đặt biến như thế này, tôi sẽ phát điên.
Dự đoán khác của tôi là sử dụng tập hợp !, nhưng điều đó cho biết "Mục tiêu chuyển nhượng không hợp lệ", vì tôi không ở dạng ràng buộc.
Xin vui lòng, hãy khai sáng cho tôi về cách thức hoạt động này.
Cảm ơn. Tôi nhận ra con đường của tôi không phải là Lispy, vì các tác dụng phụ bị cau mày. Tôi đã hack qua một cái gì đó (một vấn đề dự án Euler) và không thể có được trường hợp thử nghiệm đơn giản để làm việc, chứng minh tôi đã không hiểu một cái gì đó. Cảm ơn đã giúp đỡ. Tôi quên vòng lặp có thể giữ recur, mà hoạt động rất sạch (không có chức năng bổ sung làm đệ quy). – MBCook
Tác dụng phụ là Lispy tùy thuộc vào Lisp bạn đang xem. Trong Common Lisp, bạn sẽ tránh được (vòng lặp x = 128 rồi (/ x 2) trong khi (> x 1) làm (in x)). Nhưng tác dụng phụ không phải là Clojurish. –
Nó rất cũ Nhưng đây là một câu trả lời rất tốt, tôi mới để Clojure này đã cứu tôi từ giờ đấu tranh với cùng một vấn đề. Cảm ơn bạn rất nhiều @BrianCarper – shan