Câu hỏi của người mới trong Lisp chung:
Làm thế nào để thực hiện thủ tục của tôi để trả về đối tượng thủ tục khác biệt với ràng buộc cục bộ của chính nó mỗi lần gọi? Hiện tại, tôi sử dụng let để tạo trạng thái cục bộ, nhưng hai lệnh gọi hàm đang chia sẻ cùng một trạng thái cục bộ. Đây là mã
(defun make-acc ()
(let ((balance 100))
(defun withdraw (amount)
(setf balance (- balance amount))
(print balance))
(defun deposit (amount)
(setf balance (+ balance amount))
(print balance))
(lambda (m)
(cond ((equal m 'withdraw)
(lambda (x) (withdraw x)))
((equal m 'deposit)
(lambda (x) (deposit x)))))))
;; test
(setf peter-acc (make-acc))
(setf paul-acc (make-acc))
(funcall (funcall peter-acc 'withdraw) 10)
;; Give 90
(funcall (funcall paul-acc 'withdraw) 10)
;; Expect 90 but give 80
Tôi có nên làm theo cách khác? Là cách viết của tôi sai? Ai đó có thể giúp tôi để xóa bỏ nghi ngờ này? Cảm ơn trước.