From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.org!.POSTED.blaine.gmane.org!not-for-mail From: Michael Heerdegen Newsgroups: gmane.emacs.devel Subject: Re: Why is FUNC in cl-callf not allowed to be an expression? Date: Sat, 18 May 2019 00:53:10 +0200 Message-ID: <87tvdshew9.fsf@web.de> References: <874l631ek1.fsf@web.de> <87pnoqtuhm.fsf@web.de> <87r2961gox.fsf@web.de> <87mujohasa.fsf@web.de> <87a7fn3c6c.fsf@web.de> <875zqabh3t.fsf@web.de> <87zhnma11c.fsf@web.de> <871s0y3weo.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="186179"; 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: Stefan Monnier Original-X-From: emacs-devel-bounces+ged-emacs-devel=m.gmane.org@gnu.org Sat May 18 00:57:37 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 1hRlnE-000mJW-4E for ged-emacs-devel@m.gmane.org; Sat, 18 May 2019 00:57:36 +0200 Original-Received: from localhost ([127.0.0.1]:54913 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1hRlnD-0003Bq-5U for ged-emacs-devel@m.gmane.org; Fri, 17 May 2019 18:57:35 -0400 Original-Received: from eggs.gnu.org ([209.51.188.92]:44774) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1hRlj7-0008Tv-S1 for emacs-devel@gnu.org; Fri, 17 May 2019 18:53:22 -0400 Original-Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1hRlj6-000582-M1 for emacs-devel@gnu.org; Fri, 17 May 2019 18:53:21 -0400 Original-Received: from mout.web.de ([217.72.192.78]:44585) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1hRlj6-000500-Bl for emacs-devel@gnu.org; Fri, 17 May 2019 18:53:20 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=web.de; s=dbaedf251592; t=1558133592; bh=BJDOF4Sq6CjW17d0GcxiWA5RJn2TzQ2DKcYrxapNxZI=; h=X-UI-Sender-Class:From:To:Cc:Subject:References:Date:In-Reply-To; b=glTMr+miVQo/21hRPsygIKHthJKBQ55L4dnsiYaf9n7CTrvSR3BYLlBiFSaBtrBud 4PL9UX5kTv5D2943Rr3q4yvRhve7PJlQEDx0pIWCIniI/fkIENXl9Ab7iOhgudj/ZX z2do5CSKCa4mw7/n2GIq/PW4lM/244oFgKz45Los= X-UI-Sender-Class: c548c8c5-30a9-4db5-a2e7-cb6cb037b8f9 Original-Received: from drachen.dragon ([188.110.143.34]) by smtp.web.de (mrweb101 [213.165.67.124]) with ESMTPSA (Nemesis) id 0MJkt6-1hQfnH36X6-0019ne; Sat, 18 May 2019 00:53:11 +0200 In-Reply-To: (Stefan Monnier's message of "Thu, 16 May 2019 19:06:55 -0400") X-Provags-ID: V03:K1:BgHJsz9M4MPyhQrmB4eWdM5klG1iaJ/0hQ8UAfX3pziAAyM4Xto OrIQCiIwJLztgBYBwFHlmGJaYqVpdekWfYh+PeAWjubDHUXhOlaHGM8WLhra2daA0QNv8Th usH/Xb7tRbAs0LvymenDdBBcTdC9eLPJn9DhEI11TknWKIStg0Gu/nPAQtBDHKvvGDqoKuj BFMrszClrr5yRbyG2G5Ug== X-UI-Out-Filterresults: notjunk:1;V03:K0:v599o7QvHXE=:wGSsh9IygsICO3NqpFTgtL 8u7DlBt4PvZZDwmfRnZlqVNqbbBpNZbXQsxH1cgfWMYrRovaRrhALl4jgN4SFoq3XuM6FQm3Z ZN1B0jmRhmAQalH3m6Zl2Ms7GhKazb6XhvPbpddRHIoVHsygS9o7sVRiZpeseyGosr7gYtEEu amfqmQ03WkBz6QPNjOxqT0O2j3R+6PSw+ETen9lkoXwg46x/2kcWKM3U6B8AVXxmxHwSqaiTz omOCFWAcYQFZa1uni7MRJ9RSdueYDszcjwDamJbqUbp5Ieok2mcTHe+D5lPGKPcRk0JN3r5i9 t8J5CvVhoJ/KcomI4hII25ct0tq8jCpznwrmf3EY92ZrbxIiA3c1r1M9bt3GaO/65X4mHlitE OkIdFvVCVkW55eCs9/fqdwlSmCA1fpLt9Hu/P6qzieWc0k8tF0/LJLGjtbqgU5I7JXwF0yFXB +SETj8RKesVHlxGBnQacRpHPYkFCPZfM6umVp891+ksgQ9JOeGdAqa/PuS4ol5q5XD3i3Zvdn up8R6ttkZMkcZMVzY0JGc41v4xoPyYd6X6ZmhbvnDezsIXL4CaDFtMMrot8bsOn0NviEimS+9 EdCUbrtOipy/Py/NYhT88rPVv0dv2f3SEXjnYF9K2iV4GLdPQDMu7exWjUxQXm/TPV8U2c787 jzctPhbEdI/7z9Cdzco/WsUAHvnGoohl0nWjJUPcCeyq4pw0BHWDBOP5SR1hSbIbJXfvjhWiz 1uPcwqyFnTsg397P/vjX4MxMdgNZ6F1u2+WnPd98UJOOxw1AMmOE5k/H5u3/sqdE40EiPMGz X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 217.72.192.78 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:236685 Archived-At: Stefan Monnier writes: > So I think it needs a name which clarifies the difference. Hmm, ok. Here is a draft supporting multiple (parallel) bindings. The macro builds code by recursively calling `gv-letplace', the innermost expression is one big symbol-macrolet that makes use of the bound getters and setters. #+begin_src emacs-lisp (defmacro gv-place-bind (bindings &rest body) "Make place expression bindings. BINDINGS is a list of elements of the form (VAR PLACE). Eval BODY with... The effect is very similar to `cl-symbol-macrolet' but preferred for place expressions since it produces more efficient code. \(fn ((VAR PLACE) ...) FORM...)" (declare (indent 1)) (letrec ((helper (lambda (bindings symbols+getters+setters body) (if bindings (let ((binding (car bindings))) (gv-letplace (getter setter) (cadr binding) (funcall helper (cdr bindings) (cons (list (car binding) getter setter) symbols+getters+setters) body))) `(cl-symbol-macrolet ,(mapcar (lambda (entry) `(,(car entry) (gv-synthetic-place ,(cadr entry) ,(caddr entry)))) (nreverse symbols+getters+setters)) ,@body))))) (funcall helper bindings '() body))) #+end_src ;; Example: (let ((l '(2 3 4))) (gv-place-bind ((p (cdr l))) (unless (memq 1 p) (setf p (cons 1 p)))) l) ;; ==> (2 1 3 4) Writing the docstring made me thoughtful though - how is this different from symbol-macrolet? An advantage is that it generates a bit more efficient code for "complicated" (nested) place expressions. OTOH, the purpose of symbol-macrolet is, at the end, more or less defining abbreviations of place expressions. So I wonder now if the right thing to do is rather to improve symbol-macrolet instead to make it generate better code by consulting getters and setters itself, instead of blindly substituting. My second point in this message: thinking once more about callf, we could also support a syntax like (callf (with EXPR) PLACE ARG) or something like that to support expressions as first arg. Michael.