Пример make-bank-account
в SICP
#+BEGIN_SRC scheme
(define (make-account balance)
(define (withdraw amount)
(if (>= balance amount)
(begin (set! balance (- balance amount))
balance)
"Insufficient funds"))
(define (deposit amount)
(set! balance (+ balance amount))
balance)
(define (dispatch m)
(cond ((eq? m 'withdraw) withdraw)
((eq? m 'deposit) deposit)
(else (error "Unknown request -- MAKE-ACCOUNT"
m))))
dispatch)
(define acc (make-account 100))
((acc 'withdraw) 50)
#+END_SRC
#+RESULTS:
: 50
Переведите его на elisp, и он работает
#+begin_src emacs-lisp :lexical t
(defun make-account(balance)
(defun withdraw(amount)
(if (>= balance amount)
(progn (setq balance (- balance amount))
balance)
"Insufficient funds"))
(defun deposit(amount)
(setq balance (+ balance amount))
balance)
(defun dispatch(m)
(cond ((equal m 'withdraw) #'withdraw)
((equal m 'deposit) #'deposit)
(t (error "Unknown request -- MAKE-ACCOUNT"
m))))
#'dispatch)
(defvar B (make-account 100))
(funcall (funcall B'deposit) 30)
#+end_src
#+RESULTS:
: 130
Обратите внимание, что (equal m 'withdraw)
, здесь withdraw
сервер только для идентификациикак строка
Измените схему, заменив "вывести", чтобы "вывести",
она работает, как и ожидалось
(defun make-account(balance)
(defun withdraw(amount)
(if (>= balance amount)
(progn (setq balance (- balance amount))
balance)
"Insufficient funds"))
(defun deposit(amount)
(setq balance (+ balance amount))
balance)
(defun dispatch(m)
(cond ((equal m "withdraw") #'withdraw)
((equal m "deposit") #'deposit)
(t (error "Unknown request -- MAKE-ACCOUNT"
m))))
#'dispatch)
(defvar C (make-account 100))
(funcall (funcall C "withdraw") 30)
Какой метод мне выбрать? кажется, что (equal m "withdraw")
явно чем (равно m 'вывести) или (равно m #' вывести)