help-gnu-emacs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: Hash-table elements


From: Pascal J. Bourguignon
Subject: Re: Hash-table elements
Date: Thu, 01 Oct 2009 17:18:48 +0200
User-agent: Gnus/5.101 (Gnus v5.10.10) Emacs/22.2 (gnu/linux)

Nordlöw <per.nordlow@gmail.com> writes:

> On Sep 29, 3:17 pm, p...@informatimago.com (Pascal J. Bourguignon)
> wrote:
>> Nordlöw <per.nord...@gmail.com> writes:
>> > Can hash-tables contain references other "global" structures?
>>
>> > I have a hash-table that maps filenames to their metadata,file-scan-
>> > hits/misses.
>> > I don't want to pull-change-push the whole meta-data value whenever I
>> > change parts of these metadata/hits.
>>
>> > Is this possible somehow?
>>
>> Yes.  Only do not modify the keys!  You wouldn't be able to retrieve
>> them, since changing the state of a key would probably change its hash
>> value, and therefore the bucket where the hash-table stored it.
>> But you can do whatever you want on the value.
>>
>> (require 'cl)
>> (let ((h (make-hash-table)))
>>
>>    (let ((value (list 1 2 3))
>>          (key   :my-list))
>>
>>       (setf (gethash key h) value)
>>       (setf (car value) 0
>>             (cdr value) 'z)
>>       (gethash key h)))
>> --> (0 . z)
>>
>> --
>> __Pascal Bourguignon__
>
> So with the use of setf() we realize the reference pattern in Emacs-
> Lisp as we use pointers in C?
>
> So the value of (gethash key h) is actually a reference to "value" and
> when "value" goes out of scope the interpreter knows that it is
> referenced from another structure and does not delete its contents?
>
> I have understood it correctly?


Yes.  

However, some data types are immutable.  (Out of blue, I can think
only of numbers in emacs lisp that are immutable).  For these
immutable data types, since you cannot modify them, the system could
make copy of them, instead of using references.  


-- 
__Pascal Bourguignon__


reply via email to

[Prev in Thread] Current Thread [Next in Thread]