Subject: bug#22812: closed (Re: bug#22812: 24.5: elisp manual about pcase)

From: [email-masked] (GNU bug Tracking System)
Date: Sat, 27 Feb 2016 19:41:01 +0000

Your bug report

#22812: 24.5: elisp manual about pcase

which was filed against the emacs package, has been closed.

The explanation is attached below, along with your original report.
If you require more details, please reply to [email-masked].

-- 
22812: http://debbugs.gnu.org/cgi/bugreport.cgi?bug=22812
GNU Bug Tracking System
Contact [email-masked] with problems

Subject: Re: bug#22812: 24.5: elisp manual about pcase
From: Michael Heerdegen <[email-masked]>
To: Zhaohui Li <[email-masked]>
Cc: [email-masked]
Date: Sat, 27 Feb 2016 20:40:12 +0100
List-Id: <debbugs-submit.debbugs.gnu.org>

Ok, the example runs fine with lexical-binding enabled; thanks
nevertheless.  Closing.

Subject: 24.5: elisp manual about pcase
From: Zhaohui Li <[email-masked]>
To: [email-masked]
Date: Fri, 26 Feb 2016 10:08:09 +0800
List-Id: <debbugs-submit.debbugs.gnu.org>

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~