[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: Programmatically creating functions
From: |
Ian Eure |
Subject: |
Re: Programmatically creating functions |
Date: |
Sat, 25 Oct 2008 11:28:44 -0700 |
On Oct 21, 2008, at 11:57 AM, Andreas Politz wrote:
Joost Diepenmaat wrote:
Ian Eure <ian@digg.com> writes:
So, I have a list of symbols:
'(foo bar baz)
I want to iterate over the list and create a function from each
which
does something like this:
(defun call-foo ()
(interactive)
(invoke-stuff 'foo)
How can I accomplish this? I can't figure out how to create the
function. I've tried a number of approaches, but have not met with
success.
- eval'ing the defun. Returns a function symbol, but I can't call
it. Maybe it's only created within the scope of the (eval) and not
callable from outside?
- Creating a symbol and using fset to assign a lambda to it's
function cell. It sort of works, but I'm unclear on how to pass a
variable function name to defun, nor am I clear on how I can make
sure
it calls invoke-stuff with the right symbol.
I'm not /quite/ sure where you've got problems, but in this case
elisp's
lack of closures hurts. IMHO the simplest way to get what you want
is to
use a macro:
(defmacro make-caller-macro (symbol) `(defun ,(intern (concat
"call-" (symbol-name symbol))) () (,symbol)))
But that won't evaluate the argument, so you'd more or less have to
use
eval as well:
(dolist (s '(foo bar)) (eval `(make-caller-macro ,s)))
Does this work ? (in general)
Yes, with a little hacking, it works:
(defvar sql-connection-alist
'((poola
(sql-product 'mysql)
(sql-server "pool-a")
(sql-user "me")
(sql-password "mypass")
(sql-database "default")
(sql-port 3306))
(poolb
(sql-product 'mysql)
(sql-server "pool-b")
(sql-user "me")
(sql-password "mypass")
(sql-database "default")
(sql-port 3307)))
"AList of preset connections for `sql-connect-preset'.")
(defun sql-connect-preset (name)
"Connect to a predefined SQL connection listed in `sql-connection-
alist'"
(require 'sql)
(let ((conn (cdr (assoc name sql-connection-alist)))
(sql-name (symbol-name name)))
(eval `(let ,conn
(flet ((sql-get-login (&rest what)))
(sql-product-interactive sql-product))))))
(defun sql-convenience ()
(interactive)
(mapcar (lambda (conn)
(let ((name (car conn)))
(fset (intern (format "sql-%s" name))
`(lambda nil
,(format "Connect to %s SQL preset." name)
(interactive)
(sql-connect-preset ',name)))))
sql-connection-alist))
So now I can define preset connections and get sql-* methods to invoke
them directly.
Thank you for the help.
- Ian