From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.io!.POSTED.blaine.gmane.org!not-for-mail From: Stefan Monnier Newsgroups: gmane.emacs.devel Subject: Re: Compiler macro for apply-partially Date: Tue, 24 Aug 2021 18:32:55 -0400 Message-ID: References: <87a6l74abo.fsf@alphapapa.net> Mime-Version: 1.0 Content-Type: text/plain Injection-Info: ciao.gmane.io; posting-host="blaine.gmane.org:116.202.254.214"; logging-data="28132"; mail-complaints-to="usenet@ciao.gmane.io" User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/28.0.50 (gnu/linux) Cc: emacs-devel@gnu.org To: Adam Porter Original-X-From: emacs-devel-bounces+ged-emacs-devel=m.gmane-mx.org@gnu.org Wed Aug 25 00:33:41 2021 Return-path: Envelope-to: ged-emacs-devel@m.gmane-mx.org Original-Received: from lists.gnu.org ([209.51.188.17]) by ciao.gmane.io with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1mIezE-000776-VP for ged-emacs-devel@m.gmane-mx.org; Wed, 25 Aug 2021 00:33:40 +0200 Original-Received: from localhost ([::1]:58654 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1mIezD-0001IO-5u for ged-emacs-devel@m.gmane-mx.org; Tue, 24 Aug 2021 18:33:39 -0400 Original-Received: from eggs.gnu.org ([2001:470:142:3::10]:39368) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1mIeyg-0000cV-F5 for emacs-devel@gnu.org; Tue, 24 Aug 2021 18:33:06 -0400 Original-Received: from mailscanner.iro.umontreal.ca ([132.204.25.50]:10003) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1mIeya-0008OM-QL for emacs-devel@gnu.org; Tue, 24 Aug 2021 18:33:04 -0400 Original-Received: from pmg1.iro.umontreal.ca (localhost.localdomain [127.0.0.1]) by pmg1.iro.umontreal.ca (Proxmox) with ESMTP id A66F810020E; Tue, 24 Aug 2021 18:32:57 -0400 (EDT) Original-Received: from mail01.iro.umontreal.ca (unknown [172.31.2.1]) by pmg1.iro.umontreal.ca (Proxmox) with ESMTP id 078BD1000C9; Tue, 24 Aug 2021 18:32:56 -0400 (EDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=iro.umontreal.ca; s=mail; t=1629844376; bh=oQGsLeSpJTapkH3fkKIjFbfKA+sppkLWovO+gXaedVM=; h=From:To:Cc:Subject:References:Date:In-Reply-To:From; b=VTTkfMYx41opJtMvyja0HDBVmMUxXTfO8SEB2HTMWjVaAf58ZwlmLa6rRjOwF1h1/ USii1w6IWS4ztw5HKwD1gGDbiYjC5CYjR0yo8ZEaRS+tya1QVof1PYOV2DJZWKo9ah 6YJzp39/X4YEpTGWPdrQViZSJASHbkqJbafTRPq7myv4O8FKXsvofCGvEnQ4ef4PUy ciXsHa/zkPQir01tozc+kx13yPQcG0Tg2fiqVM71wkQLj6f93+VPB9PTxU5IZZyT2b pYcJuqTj+5wgz/Z+dS02tKg8S7mAhXukWn3iywTkU+v5AerniKOZC8D4cwuqciaQuK vWIXBkuJmgXRg== Original-Received: from alfajor (unknown [104.247.244.135]) by mail01.iro.umontreal.ca (Postfix) with ESMTPSA id D03A61202A0; Tue, 24 Aug 2021 18:32:55 -0400 (EDT) In-Reply-To: <87a6l74abo.fsf@alphapapa.net> (Adam Porter's message of "Tue, 24 Aug 2021 01:37:47 -0500") Received-SPF: pass client-ip=132.204.25.50; envelope-from=monnier@iro.umontreal.ca; helo=mailscanner.iro.umontreal.ca X-Spam_score_int: -42 X-Spam_score: -4.3 X-Spam_bar: ---- X-Spam_report: (-4.3 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, RCVD_IN_DNSWL_MED=-2.3, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: emacs-devel@gnu.org X-Mailman-Version: 2.1.23 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-mx.org@gnu.org Original-Sender: "Emacs-devel" Xref: news.gmane.io gmane.emacs.devel:272931 Archived-At: > (defun apply-partially* (fun &rest args) > "Return a function that is a partial application of FUN to ARGS. > ARGS is a list of the first N arguments to pass to FUN. The > result is a new function which does the same as FUN, except that > the first N arguments are fixed at the values with which this > function was called." > (declare (compiler-macro (lambda (exp) > `(lambda (&rest args2) > (apply ,fun ,@args args2))))) > (lambda (&rest args2) > (apply fun (append args args2)))) Looks OK to me. FWIW, I never added such a compiler macro for the following reason: it's almost always preferable to use an explicit `lambda` where you can specify how many args are expected and hence avoid the `&rest` and the `apply`, leading to significantly more efficient code. IOW if you care about performance use `lambda` rather than `apply-partially`. `apply-partially` was a hack to make it easy to build closures back when we didn't have `lexical-binding`. Adding a compiler macro to it makes it a bit less slow, but the real gain can only come after the authors provide a more complete calling convention as is the case when using `lambda`. > (defun apply-partially** (fun &rest args) This is an example of the more efficient code I'm talking about and it requires the programmer to tell us that the returned function will be called only with exactly 1 argument, so it can't be just a compiler-macro. Stefan