From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.org!not-for-mail From: Leo Newsgroups: gmane.emacs.devel Subject: Re: Common Lisp like feature expressions (was: How and when to use GCPRO?) Date: Mon, 27 Dec 2010 19:57:55 +0000 Message-ID: References: NNTP-Posting-Host: lo.gmane.org Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii X-Trace: dough.gmane.org 1293479905 13076 80.91.229.12 (27 Dec 2010 19:58:25 GMT) X-Complaints-To: usenet@dough.gmane.org NNTP-Posting-Date: Mon, 27 Dec 2010 19:58:25 +0000 (UTC) To: emacs-devel@gnu.org Original-X-From: emacs-devel-bounces+ged-emacs-devel=m.gmane.org@gnu.org Mon Dec 27 20:58:17 2010 Return-path: Envelope-to: ged-emacs-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 1PXJCy-0004N9-G6 for ged-emacs-devel@m.gmane.org; Mon, 27 Dec 2010 20:58:16 +0100 Original-Received: from localhost ([127.0.0.1]:45480 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1PXJCy-0003Cz-3n for ged-emacs-devel@m.gmane.org; Mon, 27 Dec 2010 14:58:16 -0500 Original-Received: from [140.186.70.92] (port=53036 helo=eggs.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1PXJCs-0003Cl-TS for emacs-devel@gnu.org; Mon, 27 Dec 2010 14:58:11 -0500 Original-Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1PXJCr-000803-RJ for emacs-devel@gnu.org; Mon, 27 Dec 2010 14:58:10 -0500 Original-Received: from lo.gmane.org ([80.91.229.12]:35422) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1PXJCr-0007zt-GC for emacs-devel@gnu.org; Mon, 27 Dec 2010 14:58:09 -0500 Original-Received: from list by lo.gmane.org with local (Exim 4.69) (envelope-from ) id 1PXJCo-0004Kc-JK for emacs-devel@gnu.org; Mon, 27 Dec 2010 20:58:06 +0100 Original-Received: from cpc1-cmbg13-0-0-cust596.5-4.cable.virginmedia.com ([86.9.122.85]) by main.gmane.org with esmtp (Gmexim 0.1 (Debian)) id 1AlnuQ-0007hv-00 for ; Mon, 27 Dec 2010 20:58:06 +0100 Original-Received: from sdl.web by cpc1-cmbg13-0-0-cust596.5-4.cable.virginmedia.com with local (Gmexim 0.1 (Debian)) id 1AlnuQ-0007hv-00 for ; Mon, 27 Dec 2010 20:58:06 +0100 X-Injected-Via-Gmane: http://gmane.org/ Original-Lines: 34 Original-X-Complaints-To: usenet@dough.gmane.org X-Gmane-NNTP-Posting-Host: cpc1-cmbg13-0-0-cust596.5-4.cable.virginmedia.com Face: iVBORw0KGgoAAAANSUhEUgAAACgAAAAoBAMAAAB+0KVeAAAAGFBMVEUKDAg1NjRWV1V9fnyg op/DxcLk5uP8/voi63ReAAAACXBIWXMAAAWJAAAFiQFtaJ36AAAAB3RJTUUH1goZAgAz00bgXgAA AeVJREFUKM9lk0Fz2jAQhQXJD3CCO70CmcC1YMtcWyTZ14Bl69xats4N9r6/3zWQBlodNKNPu/s0 b1cCQFuZGpfVVh3vAvBJolIXRkapSuoRUtIdFyo1Y5xSdlAj7OtvD1XnXxmWRi+eWgcxyCed1lVV B1CrKyujMoi+eLA5kU1SsjoHlW+nQjTtFxk4MXgrOxvIqzoTZR8XgPaLl419zgsMaSGFPiUOZCIh thsx5Xy9NsK8Kwf/JoQgMxcVJ301HKkcSWaT0O7FY056J4U9xcYfnmVXG4801lW6lqwu2nKFZoHC HuzvaTVndZ+LaRQgZdthXw1cpynEkLEwyFHXk/aIxNQ6QeooJuzPMB+wn+D7JJNsiCcVA13/A3h/ xE9J+WidpAwoYNmRFwyvSRhNVtsdaAewzZZP5uw82QL9+tyNfocyP0McAzICUr5Mk9RdIjWasUNx aIIt6NK4ZtXIMdfMQt3nuMAyWbLI4DqZ4xPq/ag8jPond4XU/cLuOgw6XCFX/YCUfcDAMMH58fD4 G9kDchwfqVefkBwup2uZM+Q4WhJt5jN3AxXCsaS2yXEDuWgS8VOzW0gFjhEPmLyFMKBFaLb1HRwc DiaKwx0EeTMRYnYPQRW3PP4HApvlMv0PttX5v/D6Aws3IOSEwzmLAAAAAElFTkSuQmCC User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/23.2.91 (Mac OS X 10.6.5) Cancel-Lock: sha1:UTTOVEZ133/huva7QIgveC6e3L4= X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.6 (newer, 3) X-BeenThere: emacs-devel@gnu.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "Emacs development discussions." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Original-Sender: emacs-devel-bounces+ged-emacs-devel=m.gmane.org@gnu.org Errors-To: emacs-devel-bounces+ged-emacs-devel=m.gmane.org@gnu.org Xref: news.gmane.org gmane.emacs.devel:133989 Archived-At: On 2010-12-27 19:38 +0000, Andreas Schwab wrote: > Leo writes: > >> +(defun eval-feature-expression (form) >> + (cond >> + ((atom form) (featurep form nil)) >> + ;; ensure form is a proper list >> + ((condition-case nil >> + (and (length form) nil) > > Nice quadratic behaviour. > > Andreas. How about something like this: (defun eval-feature-expression (form) (cond ((atom form) (featurep form nil)) ((eq (car form) 'not) (not (eval-feature-expression (cadr form)))) ((eq (car form) 'and) (if (not (cdr form)) t (and (eval-feature-expression (cadr form)) (eval-feature-expression (cons 'and (cddr form)))))) ((eq (car form) 'or) (if (not (cdr form)) nil (or (eval-feature-expression (cadr form)) (eval-feature-expression (cons 'or (cddr form)))))) (t (error "Invalid feature expression: %s" form)))) Leo