guile-user
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: scheme (format) question


From: Clinton Ebadi
Subject: Re: scheme (format) question
Date: Mon, 23 Mar 2009 14:15:29 -0400
User-agent: Gnus/5.13 (Gnus v5.13) Emacs/23.0.91 (gnu/linux)

Mark Polesky <address@hidden> writes:

>> (define (my-format bool string . list-of-nums)
>>  (apply format bool string (map set-precision list-of-nums)))
>> 
>> (let ((a 2.0)
>>       (b 1/4)
>>       (c 1/3))
>>  (my-format #t "~&~a ~a ~a" a b c))
>
>
> Kjetil,
>
> Awesome. Thanks. I knew there was something simple,
> I just couldn't figure it out. That little dot helps
> alot! And now for my next question...
>
> Is there a way for a pair within an alist to retrieve
> values from other pairs within the same alist? I know
> the following code doesn't work, because "my-alist"
> is still undefined when I'm calling it, but is there
> a way to make it do what I want?
>
> (define my-alist
>   `((a 1)
>     (b ,(+ 1 (cadr (assq 'a my-alist))))))

(define-macro (make-dalist . forms)
  (let ((alist-var (gensym)))
    `(letrec ((,alist-var (list))
              (slot (lambda (key)
                      (cdr (assq key ,alist-var)))))
       ,@(map (lambda (form)
                `(set! ,alist-var (acons ,(car form) ,(cdr form) ,alist-var)))
              forms)
       ,alist-var)))

(pp (macroexpand-1 '(make-dalist ('a . 2) ('b . (+ 1 (slot 'a))))))
=>
(letrec ((#{\ g8}# (list))
         (slot (lambda (key) (cdr (assq key #{\ g8}#)))))
  (set! #{\ g8}# (acons (quote a) 2 #{\ g8}#))
  (set! #{\ g8}#
    (acons (quote b) (+ 1 (slot (quote a))) #{\ g8}#))
  #{\ g8}#)

(define foo (make-dalist ('a . 2) ('b . (+ 1 (slot 'a)))))
=> 
((b . 3) (a . 2))

This only works when defining the alist, and assumes that you are only
referencing earlier entries. Perhaps useful for a limited set of things.

If you want something that updates dynamically then you really need a
different data structure. It could be done ad hoc using manually defined
accessors (e.g. 'b would not *really* exist, but would just be a
function that calls `(+ 1 ...)'), or in the fancy general way by
building a dataflow library (or, even more generally, a constraint
solver).

-- 
emacsen: every copy of Emacs comes with a bag of pot and 5 hits of acid
emacsen: and a hotel coffee maker




reply via email to

[Prev in Thread] Current Thread [Next in Thread]