Как передать лямбда-выражение в Elisp - PullRequest
4 голосов
/ 18 марта 2011

Итак, я пытаюсь сделать общую функцию веб-поиска в Elisp:

(defun look-up-base (url-formatter)
  (let (search url)
    (setq search(thing-at-point 'symbol))
    (setq url (url-formatter search))
    (browse-url url))
  )

Эта функция просто захватит слово под курсором, отформатирует слово для веб-поиска, используя url-formatter, а затем откроет строку поиска в веб-браузере, чтобы выполнить поиск.

Далее я пытаюсь реализовать функцию, которая будет гуглить слово под курсором, используя предыдущую функцию в качестве основы.

(defun google ()
  (interactive)
  (look-up-base (lambda (search) (concat "http://www.google.com/search?q=" search))))

Emacs не будет жаловаться, если я попытаюсь оценить его, но когда я пытаюсь его использовать, Emacs выдает мне это сообщение об ошибке:

setq: Symbol's function definition is void: url-formatter

И я понятия не имею, почему это происходит. Я не вижу ничего плохого в функции, что я делаю не так?

1 Ответ

9 голосов
/ 18 марта 2011

Я думаю, вам нужно использовать funcall :

Вместо (url-formatter search) вы должны иметь (funcall url-formatter search).

Лисп ожидает имя функции в качестве первого элемента списка. Если вместо этого у вас есть символ, связанный с лямбда-выражением или именем функции, вам нужно использовать funcall.

...