[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: new function proposal alist-to-hash
From: |
Andrea Corallo |
Subject: |
Re: new function proposal alist-to-hash |
Date: |
Sat, 05 Oct 2019 08:18:19 +0000 |
User-agent: |
Gnus/5.13 (Gnus v5.13) Emacs/26.2 (berkeley-unix) |
Stefan Monnier <address@hidden> writes:
>> - I think is quite useful to be able to create in a concise and
>> explicit way nested hash tables. This is a common feature of many
>> "modern" languages.
>> Here both solutions compared:
>>
>> (alist-to-hash '((a . x)
>> (b . ((i . j)
>> (k . l)))
>> (c . y)))
>>
>> (map-into `((a . x)
>> (b . ,(map-into '((i . j)
>> (k . l))
>> 'hash-table))
>> (c . y))
>> 'hash-table)
>
> Not sure I understand: if you only use it for immediate/literal data,
> then I guess you could just use the #s(hash-table data (...)) syntax.
Sure, my example was just to point out easiness of use from a syntactic
point of view. The good of having the list quoted by the user is that
he can quasi-quote when needed what he needs.
> And for non-literal maps, this needs to somehow distinguish values that
> are alists from others, like
>
> (map-into (mapcar (lambda (x)
> (if (and (consp (cdr x)) (consp (cadr x)))
> (cons (car x) (map-into (cdr x) 'hash-table))
> x))
> my-alist)
> 'hash-table)
>
> But I suspect that this is not frequently needed.
> [ BTW, the above code is screaming for something like `map-values-apply`
> but which returns a *map* rather than a list. ]
>
> And if you really need this to apply recursively, it basically means
> you don't have a map but a *tree* where each node is originally
> implemented as an alist and which you want to transform into the same
> tree where each node is now a hash-table. Again, this is likely not
> needed very frequently (and I suspect that each time it's needed, it
> will have slightly different needs/constraints).
I've maybe used not the correct nomenclature sorry.
What I want to say is that being an hash table a key value map it maps
1:1 into alist.
That said I think is quite important to be able to express in a clear
and short way nested hashes.
In python it would be simply something like this:
nested_dict = { 'dictA': {'key_1': 'value_1'},
'dictB': {'key_2': 'value_2'}}
Note that here just litteral are used but also variables can be
evaluated while creating the dictionaries.
A tree of a-list for the reason I've expressed above would be to me the
most natural way to express the same. Given that a recursive
implementation that walks this tree like the one in patch I've posted
can do the job.
Maybe I'm the only that see a value on that but I think is useful :)
>> - map-into does not let you tweak make-hash-table parameters.
>> This is especially a limitation regarding :test so is effectively a
>> solution to say ~50% of the use cases.
>
> Yes, this is a very serious limitation of `map-into`.
> I decided not to try to tackle it when I converted map.el to use
> cl-defmethod, but I'd welcome help on this.
>
>
> Stefan
Ok I'm looking into it.
Bests
Andrea
--
address@hidden
- new function proposal alist-to-hash, Andrea Corallo, 2019/10/03
- Re: new function proposal alist-to-hash, Andrea Corallo, 2019/10/04
- [PATCH] extend map-into (was: new function proposal alist-to-hash), Andrea Corallo, 2019/10/05
- Re: [PATCH] extend map-into, Stefan Monnier, 2019/10/06
- Re: [PATCH] extend map-into, Andrea Corallo, 2019/10/06
- Re: [PATCH] extend map-into, Stefan Monnier, 2019/10/08
- Re: [PATCH] extend map-into, Andrea Corallo, 2019/10/08
- Re: [PATCH] extend map-into, Stefan Monnier, 2019/10/08
- Re: [PATCH] extend map-into, Andrea Corallo, 2019/10/09
- Re: [PATCH] extend map-into, Stefan Monnier, 2019/10/09