(равно m 'вывести) против (равно m #' вывести) против (равно m “вывести”) - PullRequest
0 голосов
/ 03 ноября 2019

Пример 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 #' вывести)

...