* loading hash-table from a file?
@ 2012-01-05 5:16 ishi soichi
2012-01-05 8:35 ` Valentin Baciu
` (2 more replies)
0 siblings, 3 replies; 8+ messages in thread
From: ishi soichi @ 2012-01-05 5:16 UTC (permalink / raw)
To: help-gnu-emacs
[-- Attachment #1: Type: text/plain, Size: 534 bytes --]
I have never used hash-table of Emacs Lisp but I believe it's useful as a
database.
Say, I have a hundred key-value pairs, which are to be stored as
hash-table.
Can I save this as a (text?) file so that Emacs can load it when booting up?
I am a little confused because if I use (cons key value), it outputs "(key
. value)" which can be written in a regular file.
If I wish to find the value from a key, all I need to do is to simply
search through the file.
Do you think I can save the database using hash-table like this?
soichi
[-- Attachment #2: Type: text/html, Size: 670 bytes --]
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: loading hash-table from a file?
2012-01-05 5:16 loading hash-table from a file? ishi soichi
@ 2012-01-05 8:35 ` Valentin Baciu
2012-01-05 9:11 ` Teemu Likonen
2012-01-05 9:07 ` Eric Abrahamsen
2012-01-05 9:24 ` Teemu Likonen
2 siblings, 1 reply; 8+ messages in thread
From: Valentin Baciu @ 2012-01-05 8:35 UTC (permalink / raw)
To: ishi soichi; +Cc: help-gnu-emacs
On Thu, Jan 5, 2012 at 7:16 AM, ishi soichi <soichi777@gmail.com> wrote:
> I have never used hash-table of Emacs Lisp but I believe it's useful as a
> database.
>
> Say, I have a hundred key-value pairs, which are to be stored as
> hash-table.
> Can I save this as a (text?) file so that Emacs can load it when booting up?
>
> I am a little confused because if I use (cons key value), it outputs "(key .
> value)" which can be written in a regular file.
> If I wish to find the value from a key, all I need to do is to simply search
> through the file.
>
> Do you think I can save the database using hash-table like this?
>
> soichi
In my Emacs 24, I can read back a printed (simple) hash table. I am
not sure weather using more complex data types as values will also
work.
;; Writing the hash table to a "database" file
(with-current-buffer (find-file-noselect "/tmp/x")
(let ((h (make-hash-table)))
(puthash 'a 0 h)
(puthash 'b 1 h)
(insert (format "%s" h))
(save-buffer)))
;; Reading back the hash-table object
(type-of (read (find-file-noselect "/tmp/x")))
;; hash-table
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: loading hash-table from a file?
2012-01-05 5:16 loading hash-table from a file? ishi soichi
2012-01-05 8:35 ` Valentin Baciu
@ 2012-01-05 9:07 ` Eric Abrahamsen
2012-01-06 16:43 ` Thierry Volpiatto
2012-01-05 9:24 ` Teemu Likonen
2 siblings, 1 reply; 8+ messages in thread
From: Eric Abrahamsen @ 2012-01-05 9:07 UTC (permalink / raw)
To: help-gnu-emacs
On Thu, Jan 05 2012, ishi soichi wrote:
> I have never used hash-table of Emacs Lisp but I believe it's useful
> as a database.
>
> Say, I have a hundred key-value pairs, which are to be stored as
> hash-table.
> Can I save this as a (text?) file so that Emacs can load it when
> booting up?
>
> I am a little confused because if I use (cons key value), it outputs
> "(key . value)" which can be written in a regular file.
> If I wish to find the value from a key, all I need to do is to simply
> search through the file.
>
> Do you think I can save the database using hash-table like this?
>
> soichi
>
>
I found this on the internet (presumably authored by someone with the
initials T.V.), which does what you're asking (I used it to persist a
hash-table that I load on startup). I don't really know if it's superior
to the previous reply, but it certainly works. It produces a *.elc file,
which can be loaded with `load' (provided it's in your load-path, of
course). Whatever symbol name you originally dumped then becomes defined
again.
Eric
--8<---------------cut here---------------start------------->8---
(defun tv-dump-object-to-file (obj file)
"Save symbol object `obj' to the byte compiled version of `file'.
`obj' can be any lisp object, list, hash-table, etc...
`file' is an elisp file with ext *.el.
Loading the *.elc file will restitute object."
(require 'cl) ; Be sure we use the CL version of `eval-when-compile'.
(if (file-exists-p file)
(error "File already exists.")
(with-temp-file file
(erase-buffer)
(let* ((str-obj (symbol-name obj))
(fmt-obj (format "(setq %s (eval-when-compile %s))" str-obj str-obj)))
(insert fmt-obj)))
(byte-compile-file file) (delete-file file)
(message "`%s' dumped to %sc" obj file)))
--8<---------------cut here---------------end--------------->8---
--
GNU Emacs 24.0.92.2 (i686-pc-linux-gnu, GTK+ Version 2.24.8)
of 2012-01-04 on pellet
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: loading hash-table from a file?
2012-01-05 8:35 ` Valentin Baciu
@ 2012-01-05 9:11 ` Teemu Likonen
2012-01-05 9:13 ` ishi soichi
0 siblings, 1 reply; 8+ messages in thread
From: Teemu Likonen @ 2012-01-05 9:11 UTC (permalink / raw)
To: Valentin Baciu; +Cc: help-gnu-emacs
* 2012-01-05T10:35:18+02:00 * Valentin Baciu wrote:
> In my Emacs 24, I can read back a printed (simple) hash table. I am
> not sure weather using more complex data types as values will also
> work.
>
> ;; Writing the hash table to a "database" file
>
> (with-current-buffer (find-file-noselect "/tmp/x")
> (let ((h (make-hash-table)))
> (puthash 'a 0 h)
> (puthash 'b 1 h)
> (insert (format "%s" h))
> (save-buffer)))
Use the %S format character to print objects in machine-readable (i.e.,
READ) format.
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: loading hash-table from a file?
2012-01-05 9:11 ` Teemu Likonen
@ 2012-01-05 9:13 ` ishi soichi
0 siblings, 0 replies; 8+ messages in thread
From: ishi soichi @ 2012-01-05 9:13 UTC (permalink / raw)
To: Teemu Likonen; +Cc: help-gnu-emacs
[-- Attachment #1: Type: text/plain, Size: 649 bytes --]
Thanks everyone. I think I works well!
soichi
2012/1/5 Teemu Likonen <tlikonen@iki.fi>
> * 2012-01-05T10:35:18+02:00 * Valentin Baciu wrote:
>
> > In my Emacs 24, I can read back a printed (simple) hash table. I am
> > not sure weather using more complex data types as values will also
> > work.
> >
> > ;; Writing the hash table to a "database" file
> >
> > (with-current-buffer (find-file-noselect "/tmp/x")
> > (let ((h (make-hash-table)))
> > (puthash 'a 0 h)
> > (puthash 'b 1 h)
> > (insert (format "%s" h))
> > (save-buffer)))
>
> Use the %S format character to print objects in machine-readable (i.e.,
> READ) format.
>
[-- Attachment #2: Type: text/html, Size: 1048 bytes --]
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: loading hash-table from a file?
2012-01-05 5:16 loading hash-table from a file? ishi soichi
2012-01-05 8:35 ` Valentin Baciu
2012-01-05 9:07 ` Eric Abrahamsen
@ 2012-01-05 9:24 ` Teemu Likonen
2 siblings, 0 replies; 8+ messages in thread
From: Teemu Likonen @ 2012-01-05 9:24 UTC (permalink / raw)
To: ishi soichi; +Cc: help-gnu-emacs
* 2012-01-05T14:16:41+09:00 * ishi soichi wrote:
> Say, I have a hundred key-value pairs, which are to be stored as
> hash-table. Can I save this as a (text?) file so that Emacs can load
> it when booting up?
Yes. Use the Lisp object printing functions to print to a buffer: PRINT,
PRIN1 or (FORMAT "%S" ...). Then read the printed object with READ which
turns it to a Lisp object again.
Here's an example of the idea:
;; Print
(with-temp-file "/tmp/test"
(let ((ht (make-hash-table)))
(puthash 'a 1 ht)
(puthash 'b 2 ht)
(print ht (current-buffer))))
;; Read
(with-current-buffer
(find-file-noselect "/tmp/test")
(let ((ht (read (current-buffer))))
(list (gethash 'a ht)
(gethash 'b ht))))
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: loading hash-table from a file?
2012-01-05 9:07 ` Eric Abrahamsen
@ 2012-01-06 16:43 ` Thierry Volpiatto
2012-01-07 2:16 ` Eric Abrahamsen
0 siblings, 1 reply; 8+ messages in thread
From: Thierry Volpiatto @ 2012-01-06 16:43 UTC (permalink / raw)
To: help-gnu-emacs
Eric Abrahamsen <eric@ericabrahamsen.net> writes:
> On Thu, Jan 05 2012, ishi soichi wrote:
>
>> I have never used hash-table of Emacs Lisp but I believe it's useful
>> as a database.
>>
>> Say, I have a hundred key-value pairs, which are to be stored as
>> hash-table.
>> Can I save this as a (text?) file so that Emacs can load it when
>> booting up?
>>
>> I am a little confused because if I use (cons key value), it outputs
>> "(key . value)" which can be written in a regular file.
>> If I wish to find the value from a key, all I need to do is to simply
>> search through the file.
>>
>> Do you think I can save the database using hash-table like this?
>>
>> soichi
>>
>>
>
> I found this on the internet (presumably authored by someone with the
> initials T.V.), which does what you're asking (I used it to persist a
> hash-table that I load on startup). I don't really know if it's superior
> to the previous reply, but it certainly works. It produces a *.elc file,
> which can be loaded with `load' (provided it's in your load-path, of
> course). Whatever symbol name you originally dumped then becomes defined
> again.
>
> Eric
>
> (defun tv-dump-object-to-file (obj file)
> "Save symbol object `obj' to the byte compiled version of `file'.
> `obj' can be any lisp object, list, hash-table, etc...
> `file' is an elisp file with ext *.el.
> Loading the *.elc file will restitute object."
> (require 'cl) ; Be sure we use the CL version of `eval-when-compile'.
> (if (file-exists-p file)
> (error "File already exists.")
> (with-temp-file file
> (erase-buffer)
> (let* ((str-obj (symbol-name obj))
> (fmt-obj (format "(setq %s (eval-when-compile %s))" str-obj str-obj)))
> (insert fmt-obj)))
> (byte-compile-file file) (delete-file file)
> (message "`%s' dumped to %sc" obj file)))
I use this always to save emacs session (buffers and variables), but it
have limitations on complex hash-tables, windows objects etc...
T.V are my initials ;-)
--
Thierry
Get my Gnupg key:
gpg --keyserver pgp.mit.edu --recv-keys 59F29997
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: loading hash-table from a file?
2012-01-06 16:43 ` Thierry Volpiatto
@ 2012-01-07 2:16 ` Eric Abrahamsen
0 siblings, 0 replies; 8+ messages in thread
From: Eric Abrahamsen @ 2012-01-07 2:16 UTC (permalink / raw)
To: help-gnu-emacs
On Sat, Jan 07 2012, Thierry Volpiatto wrote:
> Eric Abrahamsen <eric@ericabrahamsen.net> writes:
>
[...]
>>
>> I found this on the internet (presumably authored by someone with the
>> initials T.V.), which does what you're asking (I used it to persist a
>> hash-table that I load on startup). I don't really know if it's superior
>> to the previous reply, but it certainly works. It produces a *.elc file,
>> which can be loaded with `load' (provided it's in your load-path, of
>> course). Whatever symbol name you originally dumped then becomes defined
>> again.
>>
>> Eric
>>
>> (defun tv-dump-object-to-file (obj file)
>> "Save symbol object `obj' to the byte compiled version of `file'.
>> `obj' can be any lisp object, list, hash-table, etc...
>> `file' is an elisp file with ext *.el.
>> Loading the *.elc file will restitute object."
>> (require 'cl) ; Be sure we use the CL version of `eval-when-compile'.
>> (if (file-exists-p file)
>> (error "File already exists.")
>> (with-temp-file file
>> (erase-buffer)
>> (let* ((str-obj (symbol-name obj))
>> (fmt-obj (format "(setq %s (eval-when-compile %s))" str-obj str-obj)))
>> (insert fmt-obj)))
>> (byte-compile-file file) (delete-file file)
>> (message "`%s' dumped to %sc" obj file)))
>
> I use this always to save emacs session (buffers and variables), but it
> have limitations on complex hash-tables, windows objects etc...
> T.V are my initials ;-)
Hats off to you sir! I use it (or rather, its dumped files) every day.
--
GNU Emacs 24.0.92.2 (i686-pc-linux-gnu, GTK+ Version 2.24.8)
of 2012-01-04 on pellet
^ permalink raw reply [flat|nested] 8+ messages in thread
end of thread, other threads:[~2012-01-07 2:16 UTC | newest]
Thread overview: 8+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2012-01-05 5:16 loading hash-table from a file? ishi soichi
2012-01-05 8:35 ` Valentin Baciu
2012-01-05 9:11 ` Teemu Likonen
2012-01-05 9:13 ` ishi soichi
2012-01-05 9:07 ` Eric Abrahamsen
2012-01-06 16:43 ` Thierry Volpiatto
2012-01-07 2:16 ` Eric Abrahamsen
2012-01-05 9:24 ` Teemu Likonen
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).