From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.org!not-for-mail From: Clinton Ebadi Newsgroups: gmane.lisp.guile.user Subject: Re: set-pair! Date: Wed, 20 Aug 2008 12:34:56 -0400 Message-ID: <87od3nzlu7.fsf@unknownlamer.org> References: NNTP-Posting-Host: lo.gmane.org Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii X-Trace: ger.gmane.org 1219250287 17442 80.91.229.12 (20 Aug 2008 16:38:07 GMT) X-Complaints-To: usenet@ger.gmane.org NNTP-Posting-Date: Wed, 20 Aug 2008 16:38:07 +0000 (UTC) Cc: guile-user@gnu.org To: "Maciek Godek" Original-X-From: guile-user-bounces+guile-user=m.gmane.org@gnu.org Wed Aug 20 18:38:59 2008 Return-path: Envelope-to: guile-user@m.gmane.org Original-Received: from lists.gnu.org ([199.232.76.165]) by lo.gmane.org with esmtp (Exim 4.50) id 1KVqhw-00033g-5E for guile-user@m.gmane.org; Wed, 20 Aug 2008 18:38:52 +0200 Original-Received: from localhost ([127.0.0.1]:51711 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1KVqgy-0006HR-9z for guile-user@m.gmane.org; Wed, 20 Aug 2008 12:37:52 -0400 Original-Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1KVqeK-0002ao-5l for guile-user@gnu.org; Wed, 20 Aug 2008 12:35:08 -0400 Original-Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1KVqeF-0002V4-46 for guile-user@gnu.org; Wed, 20 Aug 2008 12:35:07 -0400 Original-Received: from [199.232.76.173] (port=37566 helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1KVqeE-0002Ul-TH for guile-user@gnu.org; Wed, 20 Aug 2008 12:35:02 -0400 Original-Received: from deleuze.hcoop.net ([69.90.123.67]:51377) by monty-python.gnu.org with esmtps (TLS-1.0:RSA_AES_256_CBC_SHA1:32) (Exim 4.60) (envelope-from ) id 1KVqeE-0006Zx-2w for guile-user@gnu.org; Wed, 20 Aug 2008 12:35:02 -0400 Original-Received: from cpe-071-065-238-103.nc.res.rr.com ([71.65.238.103] helo=localhost.localdomain) by deleuze.hcoop.net with esmtpsa (TLS-1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.63) (envelope-from ) id 1KVqeB-0007KR-GB; Wed, 20 Aug 2008 12:34:59 -0400 In-Reply-To: (Maciek Godek's message of "Wed\, 20 Aug 2008 09\:27\:48 +0200") User-Agent: Gnus/5.11 (Gnus v5.11) Emacs/22.2 (gnu/linux) X-detected-kernel: by monty-python.gnu.org: Linux 2.6 (newer, 1) X-BeenThere: guile-user@gnu.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: General Guile related discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Original-Sender: guile-user-bounces+guile-user=m.gmane.org@gnu.org Errors-To: guile-user-bounces+guile-user=m.gmane.org@gnu.org Xref: news.gmane.org gmane.lisp.guile.user:6754 Archived-At: "Maciek Godek" writes: > Hi, > I've been trying to write a function or macro that > would work like this: > > (let ((a 0)(b 0)) > (set-pair! '(a . b) '(1 . 2)) > (cons a b)) ; => (1 . 2) > > I eventually wrote: > > (define (set-pair! pair values) > (let ( (e (the-environment)) (a (car pair)) (d (cdr pair)) ) > (local-eval > `(begin > (set! ,a ,(car values)) > (set! ,d ,(cdr values))) > e))) > > but it seems to work only for symbols defined in > global scope. Does anyone know how to implement > this form properly? You should use a macro instead... something like: (define-macro (mset! . forms) `(begin ,@(let mset-loop ((unprocessed-forms forms) (processed-forms '())) (cond ((null? unprocessed-forms) (reverse! processed-forms)) (else (mset-loop (cddr unprocessed-forms) (cons `(set! ,(car unprocessed-forms) ,(cadr unprocessed-forms)) processed-forms))))))) (let ((a 0) (b 0)) (mset! a 1 b 2) ; => (begin (set! a 1) (set! b 2)) (cons a b)) ; => (1 . 2) The syntax for mset! is the same as Common Lisp's setf[0]. You can easily adjust it to take the form (mset! (variables) (values)) if you really wanted. The macro version will interact properly with the local environment, and still work whenever local-eval is removed. Whenever you think you need local-eval you probably need a macro. Destructively modifying environments at runtime is heavily discouraged, and more or less deprecated (Guile acros and macros are deprecated in favor of mmacros for a reason--runtime modification of lexical environments is incompatible with a properly phase-separated compiler). [0] http://www.lispworks.com/documentation/HyperSpec/Body/m_setf_.htm -- Danielle: well road signs were pissing me off Danielle: I took one of them out, but the other haven't followed as planned