functional-programmingscheme

how to create an alist with initial values


I'm learning scheme (using guile) and I found the need to create an initial alist, with some keys and empty lists as their values. I was wondering what's the best practice when doing something like this. My goal is to keep this alist around so I can later add items to the lists. This is what I have now:

(define buckets
  `((hourly . ())
    (daily . ())
    (monthly . ())
    (yearly . ())))

However, this does not work when trying to assoc-set!, to append items to the list. This, however, works:

(define buckets
  (acons 'hourly '()
         (acons 'daily '()
                (acons 'monthly '()
                       (acons 'yearly '() '())))))

Clearly not the best looking piece of code. Is there a more idiomatic way of building such an alist? Maybe I'm doing this completely wrong. The end goal is to have these buckets that I can refer to later in different parts of code by their key.

Thanks!


Solution

  • scheme@(guile-user)> (acons 'hourly '()
             (acons 'daily '()
                    (acons 'monthly '()
                           (acons 'yearly '() '()))))
    $2 = ((hourly) (daily) (monthly) (yearly))
    

    is the same as

    scheme@(guile-user)> '((hourly) (daily) (monthly) (yearly))
    $3 = ((hourly) (daily) (monthly) (yearly))
    
    scheme@(guile-user)> (equal? $2 $3)
    $4 = #t
    

    EDIT assoc-set! doesn't work in this case because these lists are not mutable. One way to achieve a mutable list while still shortening the way to define it is to use this expression instead:

    (map list '(hourly daily montly yearly))