From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.org!not-for-mail From: ludo@gnu.org (Ludovic =?iso-8859-1?Q?Court=E8s?=) Newsgroups: gmane.lisp.guile.devel Subject: Poor man's constant folding Date: Wed, 16 Jun 2010 00:27:12 +0200 Message-ID: <874oh4j5j3.fsf@gnu.org> NNTP-Posting-Host: lo.gmane.org Mime-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Trace: dough.gmane.org 1276640854 12605 80.91.229.12 (15 Jun 2010 22:27:34 GMT) X-Complaints-To: usenet@dough.gmane.org NNTP-Posting-Date: Tue, 15 Jun 2010 22:27:34 +0000 (UTC) To: guile-devel@gnu.org Original-X-From: guile-devel-bounces+guile-devel=m.gmane.org@gnu.org Wed Jun 16 00:27:33 2010 connect(): No such file or directory Return-path: Envelope-to: guile-devel@m.gmane.org Original-Received: from lists.gnu.org ([199.232.76.165]) by lo.gmane.org with esmtp (Exim 4.69) (envelope-from ) id 1OOebU-0003Pe-UV for guile-devel@m.gmane.org; Wed, 16 Jun 2010 00:27:33 +0200 Original-Received: from localhost ([127.0.0.1]:47076 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1OOebU-0000hJ-9v for guile-devel@m.gmane.org; Tue, 15 Jun 2010 18:27:32 -0400 Original-Received: from [140.186.70.92] (port=40970 helo=eggs.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1OOebN-0000fw-5F for guile-devel@gnu.org; Tue, 15 Jun 2010 18:27:27 -0400 Original-Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.69) (envelope-from ) id 1OOebM-0001ei-21 for guile-devel@gnu.org; Tue, 15 Jun 2010 18:27:25 -0400 Original-Received: from lo.gmane.org ([80.91.229.12]:50481) by eggs.gnu.org with esmtp (Exim 4.69) (envelope-from ) id 1OOebL-0001dw-IS for guile-devel@gnu.org; Tue, 15 Jun 2010 18:27:24 -0400 Original-Received: from list by lo.gmane.org with local (Exim 4.69) (envelope-from ) id 1OOebJ-0003LU-Sq for guile-devel@gnu.org; Wed, 16 Jun 2010 00:27:21 +0200 Original-Received: from acces.bordeaux.inria.fr ([193.50.110.5]) by main.gmane.org with esmtp (Gmexim 0.1 (Debian)) id 1AlnuQ-0007hv-00 for ; Wed, 16 Jun 2010 00:27:21 +0200 Original-Received: from ludo by acces.bordeaux.inria.fr with local (Gmexim 0.1 (Debian)) id 1AlnuQ-0007hv-00 for ; Wed, 16 Jun 2010 00:27:21 +0200 X-Injected-Via-Gmane: http://gmane.org/ connect(): No such file or directory Original-Lines: 84 Original-X-Complaints-To: usenet@dough.gmane.org X-Gmane-NNTP-Posting-Host: acces.bordeaux.inria.fr X-URL: http://www.fdn.fr/~lcourtes/ X-Revolutionary-Date: 28 Prairial an 218 de la =?iso-8859-1?Q?R=E9volution?= X-PGP-Key-ID: 0xEA52ECF4 X-PGP-Key: http://www.fdn.fr/~lcourtes/ludovic.asc X-PGP-Fingerprint: 83C4 F8E5 10A3 3B4C 5BEA D15D 77DD 95E2 EA52 ECF4 X-OS: x86_64-unknown-linux-gnu User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/23.2 (gnu/linux) Cancel-Lock: sha1:c6M7220W47QVUBDIY1LM9t/XbxA= X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.6 (newer, 3) X-BeenThere: guile-devel@gnu.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "Developers list for Guile, the GNU extensibility library" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Original-Sender: guile-devel-bounces+guile-devel=m.gmane.org@gnu.org Errors-To: guile-devel-bounces+guile-devel=m.gmane.org@gnu.org Xref: news.gmane.org gmane.lisp.guile.devel:10496 Archived-At: Hello! Here’s an experiment to implement constant folding using plain macros (while waiting for an implementation of Wadell’s inlining algorithm ;-)): --8<---------------cut here---------------start------------->8--- (use-modules (srfi srfi-1)) (define-syntax define-nary-constructor (lambda (s) (syntax-case s () ((_ name pred) (identifier? #'name) (let ((p (symbol-append '% (syntax->datum #'name) '-proc))) (with-syntax ((proc-name (datum->syntax #'name p))) #'(begin (eval-when (expand) (define proc-name name)) (define-syntax name (lambda (x) (syntax-case x () ((_ . args) (every pred (syntax->datum #'args)) (apply proc-name (syntax->datum #'args))) ((_ . args) #'(proc-name . args)) (_ #'proc-name))))))))))) (define-nary-constructor + number?) (define-nary-constructor - number?) (define-nary-constructor / number?) (define-nary-constructor * number?) --8<---------------cut here---------------end--------------->8--- It works transparently in all the cases I could think of: scheme@(guile-user)> (+ 2 3) 5 scheme@(guile-user)> + # scheme@(guile-user)> %+-proc # scheme@(guile-user)> ,c (+ "a" "b") Disassembly of #: 0 (assert-nargs-ee/locals 0) 2 (load-symbol "%+-proc") ;; %+-proc 13 (link-now) 14 (variable-ref) 15 (load-string "a") ;; "a" 20 (load-string "b") ;; "b" 25 (tail-call 2) scheme@(guile-user)> (use-modules (oop goops)) scheme@(guile-user)> (define-method (+ (a ) (b )) (string-append a b)) scheme@(guile-user)> (+ "a" "b") "ab" The main shortcoming is that it doesn’t work recursively: scheme@(guile-user)> ,c (+ 1 (+ 2 (+ 3 4))) Disassembly of #: 0 (assert-nargs-ee/locals 0) 2 (load-symbol "%+-proc") ;; %+-proc 13 (link-now) 14 (variable-ref) 15 (make-int8:1) ;; 1 16 (new-frame) 17 (load-symbol "%+-proc") ;; %+-proc 28 (link-now) 29 (variable-ref) 30 (make-int8 2) ;; 2 32 (make-int8 7) ;; 7 34 (call 2) 36 (tail-call 2) I’m not sure this can be worked around reasonably. Comments? Thanks, Ludo’.