2013-08-22 2 views
2

Я час нового программирования в Emacs lisp. У меня есть небольшой опыт работы со схемой, поэтому я понимаю общую картину лизиса в целом. Однако я использовал только «чисто функциональный» подмножество схемы и не знаю, как выполнять практические задания.Оценка Elisp в emacs

Напиши сейчас, я знаю, что C-x C-e будет оценивать код, заключенный в круглые скобки, текущей позицией курсора.

Я хочу зацикливаться от i = 1 до 10 и распечатать значения i out. Как это делается? Я попытался следующие:

(defvar i 1) 
(while (< i 11) 
    (print "i: " i) 
    (setq i (+ i 1))) 

Emacs говорит мне: invalid function 0.

  1. Как это сделать правильно?
  2. Почему Emacs рассказывающие мне invalid function 0

Вы можете дать мне советы о том, как использовать буфер царапанию (все, что я знаю C-x C-e оценивает) в Emacs. Спасибо за помощь!

EDIT1: Может ли кто-нибудь сказать мне, как распечатать последовательные значения i с использованием цикла while?

EDIT2: Когда я оцениваю код, он открывает еще один крошечный буфер, отображающий каждое значение i по одному за раз. Однако он не является большим буфером и показывает только значения i с 13 по 19. Когда я пытаюсь попасть в этот буфер, он немедленно закрывается. Как «прокручивать» через этот крошечный буфер? Обратите внимание, что я использую emacs 24.3 через терминал

EDIT3: Я понял, что крошечный буфер является буфером сообщений. Есть ли лучший способ просмотреть вывод моего кода elisp? Буфер сообщений заполнен другим нежелательным результатом оценки вещей в emacs.

+1

'C-h i g (eintr) RET' для начала и' C-h i g (elisp) 'в общем. (и 'h' в читателе информации, чтобы узнать, как его использовать.) – phils

ответ

3

Прежде всего, включить «Enter отладчик ошибок» из меню Options и добавьте (setq debug-on-error t) или (custom-set-variables '(debug-on-error t)) к вашему ~/.emacs.el.

Тогда вы получите *Backtrace* буфер на С-х С-е:

Debugger entered--Lisp error: (invalid-function 1) 
    1(10) 
    print("i: " 1) 
    (while (< i 11) (print "i: " i) (setq i (+ i 1))) 
    eval((while (< i 11) (print "i: " i) (setq i (+ i 1))) nil) 
    eval-last-sexp-1(nil) 
    eval-last-sexp(nil) 
    call-interactively(eval-last-sexp nil nil) 
    command-execute(eval-last-sexp) 

, который показывает, что ошибка происходит из print.

C-H F печать RET расскажет вам, почему, но результат в том, что вы хотите использовать insert вместо print здесь.

+0

Я использовал emacs через терминал. Как включить «Ввести отладчик при ошибке»? – CodeKingPlusPlus

+0

@CodeKingPlusPlus: оцените форму 'setq' в моем ответе. – sds

+0

Я положил 'setq' в свой файл' .emacs' и попытался оценить 'setq' в моем буфере с нуля. Когда я пытаюсь оценить код, он все равно дает те же ошибки ... Однако отладчик появляется, когда я запускаю emacs из-за того, что я загружаю. Поэтому интересно, что он работает в этом случае ... – CodeKingPlusPlus

1

Вы можете оценить sexps Emacs-Lisp в *scratch* или в любом другом буфере в том же режиме или (в моем предпочтении) в режиме emacs-lisp-mode.

В *scratch* вам нужно только нажать C-j (newline) после sexp, чтобы оценить его. В буфере emacs-lisp-mode вы, как вы сказали, можете использовать C-x C-e после sexp. Или вы можете использовать M-x evaluate-region после выбора одного или нескольких sexps.Как всегда, C-h m в любом режиме сообщает вам об этом и обычно перечисляет важные привязки клавиш.

Вы также можете проверить значение глобальной переменной, используя C-h v SOME-VAR. И вы можете оценить любой сексп на лету от минибуфера, используя M-:. Например: M-: (setq foo (+ 42 (length bar)))

WRT отладчик:

  • Как уже упоминалось @sds, debug-on-error ставит вас в отладчик, когда возникает ошибка. Вы также можете установить debug-on-quit, а затем ввести отладчик с помощью C-g для выхода (например, во время цикла).

  • Если вы знаете функцию, которую хотите отлаживать, вы можете использовать M-x debug-on-entry.

  • Пройдите через отладчик, используя d, или пропустите до конца шага, используя c. Используйте q для выхода из отладчика.

  • Вы также можете вставить вызовы функции debug в исходный код, в качестве точек входа отладчика: (debug).

Цепочка вызовы в отладчике всегда более информативен, если вы загрузите соответствующий исходный файл, например, foo.el, вместо байт скомпилированного файла, например, foo.elc. Поэтому, прежде чем использовать M-x debug-on-entry, используйте C-h f, чтобы узнать, в каком файле определена функция, а затем загрузите этот файл, используя M-x load-file /path/to/the/file.el.

Существует также еще один отладчик, кроме debug - ищите edebug в руководстве Elisp. Некоторые предпочитают edebug; Я предпочитаю debug.

3

Как добавленное примечание, поскольку вы упомянули о знании какой-либо схемы - если вам нравится интерактивный REPL, который вы можете использовать в типичной среде схемы, вам может понравиться ielm - я думаю, что это, вероятно, означает режим Interactive Emacs Lisp. Не уверен. Во всяком случае, M-x ielm RET откроет emacs lisp REPL. Иногда это действительно полезно - например, когда вы хотите проверить содержимое переменной с большим количеством данных в ней, ielm распечатает все это. Иелм встроена в мой Emacs. Не уверен, когда он был добавлен к стандартным дистрибутивам, но самые ранние авторские права в источнике говорят в 1994 году, поэтому, вероятно, это ваш Emacs.

+1

Inferior Emacs Lisp Mode на самом деле. – lunaryorn

+0

Очень полезно! Но я до сих пор не могу распечатать последовательные значения 'i' – CodeKingPlusPlus

+0

Оформить мои последние изменения ... – CodeKingPlusPlus

Смежные вопросы