Khi đọc "Schemer dày dặn", tôi đã bắt đầu tìm hiểu về letrec
. Tôi hiểu những gì nó làm (có thể được nhân đôi với một Y-Combinator) nhưng cuốn sách đang sử dụng nó thay cho định kỳ trên chức năng đã define
d hoạt động trên các đối số vẫn còn tĩnh.Lợi ích của letrec là gì?
Một ví dụ về một chức năng cũ bằng cách sử dụng define
d chức năng định kỳ trên chính nó (không có gì đặc biệt):
(define (substitute new old l)
(cond
((null? l) '())
((eq? (car l) old)
(cons new (substitute new old (cdr l))))
(else
(cons (car l) (substitute new old (cdr l))))))
Bây giờ cho một ví dụ về chức năng tương tự nhưng sử dụng letrec
:
(define (substitute new old l)
(letrec
((replace
(lambda (l)
(cond
((null? l) '())
((eq? (car l) old)
(cons new (replace (cdr l))))
(else
(cons (car l) (replace (cdr l))))))))
(replace lat)))
Ngoài từ được hơi lâu hơn và khó đọc hơn Tôi không biết tại sao họ đang viết lại các chức năng trong cuốn sách để sử dụng letrec. Có một tăng cường tốc độ khi định kỳ trên một biến tĩnh theo cách này bởi vì bạn không tiếp tục vượt qua nó ??
Thực hành tiêu chuẩn này cho các hàm có đối số vẫn tĩnh nhưng một đối số được giảm (chẳng hạn như định kỳ lại các phần tử của danh sách)?
Một số đầu vào từ các Schemers/LISPers có kinh nghiệm hơn sẽ hữu ích!
Cảm ơn bạn đã xây dựng! 1 tất nhiên. –
Như thường lệ, được viết và rất hữu ích (cảm ơn bạn đã đề cập đến mô-đun thời gian). Tôi biết tôi nhận được rất nhiều sự giúp đỡ của bạn miễn phí, vì vậy, cảm ơn bạn Eli đã dành thời gian mà bạn làm để đăng câu trả lời của bạn. Các cuộc thảo luận bình luận của bạn với các áp phích khác cũng hữu ích trong những điều nhỏ nhặt mà tôi không biết hoặc không thích thú. Cảm ơn bạn lần nữa! – Ixmatus