How to partially evaluate elements in a hash-table

Q&A's, tips, howto's
Locked
lyl
Posts: 44
Joined: Sun Mar 25, 2018 5:00 am

How to partially evaluate elements in a hash-table

Post by lyl »

I construct a hash-table like this:

Code: Select all

(setq mytable '(
	      ((char "a") "a: choiceA" (+ 0 101))
	      ((char "b") "b: choiceB" (+ 0 102))
	      ))
In this example, I want the first element of each sublist to be evaluated while other elements not. That is to say, (char "a") should be 97, (char "b") should be 98.
Or, in common, how to partially evaluate elements in a hash-table? Is there an easy to achieve this?

cameyo
Posts: 183
Joined: Sun Mar 27, 2011 3:07 pm
Location: Italy
Contact:

Re: How to partially evaluate elements in a hash-table

Post by cameyo »

Try this:

Code: Select all

(map (fn (x) (eval (first x))) mytable)
;-> (97 98)

lyl
Posts: 44
Joined: Sun Mar 25, 2018 5:00 am

Re: How to partially evaluate elements in a hash-table

Post by lyl »

Sorry, I didn't make my question clear.
What I want is not the result of each first element evaluation. I want to get a easy way to construct "mytable" from

Code: Select all

'(((char "a") "a: choiceA" (+ 0 101))  ((char "b") "b: choiceB" (+ 0 102)))
to

Code: Select all

'((97 "a: choiceA" (+ 0 101)) (98 "b: choiceB" (+ 0 102)))

cameyo
Posts: 183
Joined: Sun Mar 27, 2011 3:07 pm
Location: Italy
Contact:

Re: How to partially evaluate elements in a hash-table

Post by cameyo »

Maybe this:

Code: Select all

(setq a '(((+ 6 2) (a) 2) ((- 2 5) (b) 5)))
;-> (((+ 6 2) (a) 2) ((- 2 5) (b) 5))
(dolist (el a)
 (setf (first (a $idx)) (eval (first el)))
)
a
;-> ((8 (a) 2) (-3 (b) 5))

lyl
Posts: 44
Joined: Sun Mar 25, 2018 5:00 am

Re: How to partially evaluate elements in a hash-table

Post by lyl »

Yet, is there a better way to evaluate elements in hash-table when constructing hash-table, as like the comma expression in common lisp?

al1ranger
Posts: 1
Joined: Sat Jun 29, 2019 8:05 am

Re: How to partially evaluate elements in a hash-table

Post by al1ranger »

This can be one way of doing it. The quote function can also be used if the list is being built at runtime.

Code: Select all

(setq mytable (list (list (char "a") "a: choiceA" '(+ 0 101)) (list (char "b") "b: choiceB" '(+ 0 102))))

Locked