HPW wrote:And finally when I need the assoc list into symbols:

- Code: Select all
`(map (fn (x) (set(sym(first x))(last x)))assoclst)`

HPW,

With the above, you caused me to have a crazy thought. Make a macro that does `let`-type bindings for you, given an assoc list; then, you could write any code under that `let` to do more computations. Having a form of a `let` keeps the bindings local (i.e., does not pollute your top-level).

Here's the macro. (Notice that I'm using your idea to make the bindings.)

- Code: Select all
`(define-macro (let-alist [alist])`

(letex ([bindings]

(map (fn (b) (list (sym (b 0)) (b 1)))

(letex ([alist] [alist]) [alist]))

[body]

(cons 'begin (args)))

(let [bindings] [body])))

Now, a simple usage: list `a` and `b` and their sum.

- Code: Select all
`(let-alist '(("a" 3) ("b" 4))`

(list a b (+ a b)))

--> (3 4 7)

Here's a more complex usage: find the sum and average of the `a` and `b` columns.

- Code: Select all
`(let (asum 0 bsum 0 N 0)`

(dolist (alist (csv->alists csv))

(let-alist alist

(inc asum a)

(inc bsum b))

(inc N))

(list 'asum asum 'aavg (div asum N)

'bsum bsum 'bavg (div bsum N)))

--> (asum 9 aavg 3 bsum 12 bavg 4)

Of course, `csv` is fdb's example:

- Code: Select all
`(set 'csv '(("a" "b") (1 2) (3 4) (5 6)))`

And the `csv->alists` function is just fdb's solution to your problem.

- Code: Select all
`(define (csv->alists csv)`

(map (fn (x) (map list (first csv) x))

(rest csv)))

There might be a simpler way. Please let me know if you find one! Cheers. --Rick

(λx. x x) (λx. x x)