Hi,

Maybe one reason is will it be complicated to do garbage collection on a hash 
table? In theory its possible but maybe it will be a bit tedious compare to 
linked list data struct.


BR,
geo

> On Apr 28, 2019, at 3:24 AM, C K Kashyap <ckkash...@gmail.com> wrote:
> 
> Thank you so much for your detailed explanation.
> 
>> On Sat, Apr 27, 2019 at 10:46 AM Joh-Tob Schäg <johtob...@gmail.com> wrote:
>> Lisp is language where expression are executed in order. Since lisp code is 
>> expressed in data, we need something that has a way of expression of express 
>> ordering.
>> That is possible in a dictionary too. Let's imagine the code:
>> {fak => {1 => {1 => N}, {2=>{1=>if, 2=>{1 => =, 2=> N, 3=>0}, 3=>1, 4=>{1=> 
>> *, 2=> N ,3=> {1=>fib, 2=>{1=>dec,2=>N}}}}}}}
>> I think we would need 9 independent hash tables to store simplest of 
>> programs i could come up with. Of course another grammar would be choose 
>> which leads to flatter hierarchies but that is a point which i can not 
>> elaborate further here.
> 
> I was thinking along the lines of transforming a list -> (A B C) into {1 A, 2 
> B, 3 C} where the ordering simply transforms into an ordered key. Or 
> transforming a dictionary {K1 : V1, K2: V2} into a list as (K1 V1 K2 V2). 
> Which in my mind would translate into 1 list transforms into 1 dictionary or 
> the other way.
>  
>> I doubt that dictionaries would more efficient. This idea may stem from a 
>> confusion about O(x). The big O notation talks about asymptotic time 
>> complexity as how do they compare when the number of elements gets infinite. 
>> Many problems of humans including computing are decidedly finite, maybe even 
>> "small". Algorithms with worse BigO might be better for many all practical 
>> use cases.
>> 
>> Furthermore a person stating that dicts are a more efficient has probably
>> a) never used one in the way i stated above
>> b) has never looked at the assembly for both
>> c) is unaware of the cache hierarchy
>> 
> 
> Efficiency was only a "potential" possibility I was suggesting but I totally 
> get what you are saying and I don't believe that O(1) promise of hashtable is 
> a free of caveats.
>  
>> I invite you to reflect your idea bearing these in mind.
>> Furthermore hash table (how you would often implement a dict) does not 
>> "really" have an access time of 0(1) it has a best case O(N/m) where N is 
>> the number of elements and M the number of buckets The O(1) like behaviour 
>> is achieved by doing a rehashing in to a larger hash table which is a 
>> N*O(n/m) effort.
>> Furthermore many operations possible with lists are not trivially possible 
>> with dicts that replace lists. 
>> Nesting as seen above is one of them.
>> Operations which require a complete rehash of the hash table are:
>>  - inserting an element anywhere
>>  - removing an element anywhere 
>> 
>> Furthermore as seen above access time of any element in a hash table is 
>> proportional to: O(N/M)
>> Access time in a list is proportional to: O(N-K) where the Nth element is 
>> the one we want to get and the Kth is element we know and use a an 
>> entrypoint to gollow the list. 
>> Getting the next element in a list is there for O(1) while in a hash table 
>> it is O(N/M) with an additional overhead for calculating the hash table.
>> If you have an strict ordering of execution (as you might want as a 
>> programmer) a list gives you fast access to the next piece of code. A hash 
>> table would give you access to all elements equally slow.
>> 
>> Additionally hash tables are when used as above way more space inefficient 
>> than linked lists. That means fewer information fits in the cache -> slower. 
>> For the performance of the Hash tables it is important that things are 
>> equally distributed over all buckets. This is done by using a hash that 
>> places them "without pattern". (In hash table theory the ideal hash table 
>> uses a random oracle to generate the hashes, which is random number 
>> generator that gives you an random number for a never seen before item or 
>> the number from last time if the item is already known)
>> This kills the cache and all speculative execution schemes used to speed up 
>> modern processors.
> 
> Would I be right if I summarize the above as - operational efficiency the 
> reason List is chosen as the data structure for LISP? And it doesn't hurt 
> that it is also the simpler of the two :)
>  
>> 
>> I invite you to program a lisp interpreter in lua with the addressing scheme 
>> above. Lua has only hash tables as data structure. You can see if you are 
>> faster. I guess you are not. Even if you run a LuaJIT which compiles stuff 
>> done and is quiet competitive speed wise.
>> 
> 
> No thanks :) .. PicoLisp is my final language!
> 
>  
>> 
>> 
>> 
>> 
>> 
>>> On Sat, 27 Apr 2019 at 17:26, C K Kashyap <ckkash...@gmail.com> wrote:
>>> Hi Alex et al,
>>> I've wondered about this question for a bit. Why should list be the 
>>> fundamental data type? Should it not be a dictionary? Dictionary is 
>>> essentially a function - mapping a domain to a range. 
>>> 
>>> Is it that list could be built more easily with cons cell as the building 
>>> block? Is it like list and dictionary are like the universal gates nand and 
>>> nor - one is preferred because of the nature of the material being used? I 
>>> use the universal gates example here because I was fascinated by the idea 
>>> that I could represent a dictionary in a list (although less efficient) and 
>>> a list in a dictionary (potentially improving the efficiency).
>>> 
>>> Regards,
>>> Kashyap

Reply via email to