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

[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




reply via email to

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