The "10.2.1: Pattern matching case statement" in Emacs Lisp Referrence Manual has a problem.
The second example in manual is:
(defun evaluate (exp env)
(pcase exp
(`(add ,x ,y) (+ (evaluate x env) (evaluate y env)))
(`(call ,fun ,arg) (funcall (evaluate fun env) (evaluate arg env)))
(`(fn ,arg ,body) (lambda (val)
(evaluate body (cons (cons arg val) env))))
((pred numberp) exp)
((pred symbolp) (cdr (assq exp env)))
(_ (error "Unknown _expression_ %S" exp))))
The problem is about the third case: `(fn , arg ,body).
I test this function with:
(evaluate '(call
(fn x (add 1 x))
2)
nil)
emcas eval it with throw errors.
I think the correct of this function should be:
(defun evaluate (exp env)
(pcase exp
(`(add ,x ,y)
(+ (evaluate x env)
(evaluate y env)))
(`(call ,fun ,arg)
(funcall (evaluate fun env)
(evaluate arg env)))
(`(fn ,arg ,body)
`(lambda (val)
(evaluate ',body (cons (cons ',arg val) env))))
((pred numberp)
exp)
((pred symbolp)
(cdr (assq exp env)))
(_
(error "Unknown _expression_ %S" exp))))
Thanks~