Tôi đã học được khá nhiều sơ đồ từ SICP nhưng giờ đây tôi quan tâm hơn đến vấn đề chung. Tôi biết sốcủa lisp thông thường là reduce
, với các đối số đặc biệt cho gấp trái hoặc phải, nhưng tương đương với unfold
là gì? Googling đã không giúp nhiều. Trong thực tế, tôi nhận được ấn tượng không có mở ra ???"mở ra" cho lisp chung?
Trả lời
Lisp thường có (loop ... collect ...)
. Hãy so sánh
(loop for x from 1 to 10 collect (* x x))
với tính tương đương của nó sử dụng unfold
:
(unfold (lambda (x) (> x 10)) (lambda (x) (* x x)) (lambda (x) (+ x 1)) 1)
Nói chung, về cơ bản là (unfold p f g seed)
(loop for x = seed then (g x) until (p x) collect (f x))
Edit: sửa chữa typo
Các hyperspec lisp phổ biến không xác định một chức năng unfold
, nhưng bạn chắc chắn có thể viết của riêng bạn. Định nghĩa lược đồ của nó dịch gần như biểu tượng cho biểu tượng.
Cảm ơn. Điều đó thật không may, nhưng tôi cho là có, tôi sẽ tự viết. Tôi thực sự thích chương trình để được như vậy tinh khiết và có tốt đẹp như vậy chức năng tốt đẹp, nhưng tôi đã loại từ bỏ bản thân mình để học rối, lisp phổ biến nhưng biểu cảm. Nó giống như học tiếng Anh hơn là esperanto, bạn biết không? – nullpointer
Hmm thật thú vị. Tôi đã chơi xung quanh với vòng lặp trong giờ qua: P công cụ tuyệt vời của nó! Tôi yêu thích khi các ngôn ngữ lập trình có những loại ngôn ngữ phụ được nhúng này có cú pháp và bộ quy tắc để hiểu, như các chuỗi định dạng. Vòng lặp là thứ mạnh mẽ! – nullpointer
Chào mừng bạn đến với bóng tối. – huaiyuan