From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.org!.POSTED.blaine.gmane.org!not-for-mail From: Stefan Monnier Newsgroups: gmane.emacs.devel Subject: Re: Why is FUNC in cl-callf not allowed to be an expression? Date: Tue, 14 May 2019 22:02:06 -0400 Message-ID: References: <874l631ek1.fsf@web.de> <87pnoqtuhm.fsf@web.de> <87r2961gox.fsf@web.de> <87mujohasa.fsf@web.de> Mime-Version: 1.0 Content-Type: text/plain Injection-Info: blaine.gmane.org; posting-host="blaine.gmane.org:195.159.176.226"; logging-data="154826"; mail-complaints-to="usenet@blaine.gmane.org" User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/27.0.50 (gnu/linux) Cc: emacs-devel@gnu.org To: Michael Heerdegen Original-X-From: emacs-devel-bounces+ged-emacs-devel=m.gmane.org@gnu.org Wed May 15 04:02:27 2019 Return-path: Envelope-to: ged-emacs-devel@m.gmane.org Original-Received: from lists.gnu.org ([209.51.188.17]) by blaine.gmane.org with esmtps (TLS1.0:RSA_AES_256_CBC_SHA1:256) (Exim 4.89) (envelope-from ) id 1hQjFR-000e3i-Ku for ged-emacs-devel@m.gmane.org; Wed, 15 May 2019 04:02:25 +0200 Original-Received: from localhost ([127.0.0.1]:57722 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1hQjFL-0002vc-K6 for ged-emacs-devel@m.gmane.org; Tue, 14 May 2019 22:02:19 -0400 Original-Received: from eggs.gnu.org ([209.51.188.92]:35504) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1hQjFE-0002vQ-EY for emacs-devel@gnu.org; Tue, 14 May 2019 22:02:13 -0400 Original-Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1hQjFD-0007xY-EE for emacs-devel@gnu.org; Tue, 14 May 2019 22:02:12 -0400 Original-Received: from chene.dit.umontreal.ca ([132.204.246.20]:34253) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1hQjFD-0007wz-A2 for emacs-devel@gnu.org; Tue, 14 May 2019 22:02:11 -0400 Original-Received: from ceviche.home (lechon.iro.umontreal.ca [132.204.27.242]) by chene.dit.umontreal.ca (8.14.7/8.14.1) with ESMTP id x4F227dq020161; Tue, 14 May 2019 22:02:08 -0400 Original-Received: by ceviche.home (Postfix, from userid 20848) id 5436966227; Tue, 14 May 2019 22:02:06 -0400 (EDT) In-Reply-To: <87mujohasa.fsf@web.de> (Michael Heerdegen's message of "Wed, 15 May 2019 01:32:53 +0200") X-NAI-Spam-Flag: NO X-NAI-Spam-Threshold: 5 X-NAI-Spam-Score: 0 X-NAI-Spam-Rules: 2 Rules triggered EDT_SA_DN_PASS=0, RV6546=0 X-NAI-Spam-Version: 2.3.0.9418 : core <6546> : inlines <7077> : streams <1821554> : uri <2844608> X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 132.204.246.20 X-BeenThere: emacs-devel@gnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: "Emacs development discussions." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: emacs-devel-bounces+ged-emacs-devel=m.gmane.org@gnu.org Original-Sender: "Emacs-devel" Xref: news.gmane.org gmane.emacs.devel:236529 Archived-At: > (defmacro gv-with-place (place f) > (declare (indent 1)) > (gv-letplace (getter setter) place > (let ((v (make-symbol "v"))) > `(funcall ,f ,getter (lambda (,v) ,(funcall setter v)))))) We could at least avoid the overall `funcall`: (defmacro gv-with-place (val setfun place &rest body) (declare (indent 3)) (gv-letplace (getter setter) place `(let ((,val ,getter) (,setfun (lambda (v) ,(funcall setter 'v)))) ,@body))) Along the same lines maybe we could provide a (gv-ref VAL SETFUN) pcase-macro, so you could do (pcase-let (((gv-ref val setter) (gv-ref PLACE))) (unless (member X val) (funcall setter (cons X val)))) Even better would be if we could do (pcase-let (((gv-ref p) (gv-ref PLACE))) (unless (member X p) (setf p (cons X p)))) but it seems this would require non-trivial changes to pcase (since basically `p` should not be bound there with a `let` but with a `cl-symbol-macrolet`). Still, I think the `gv-modify` discussed earlier hits a sweeter spot. Stefan