Вопрос: оценивать выражения Lisp


Я выполнил следующую команду из командной строки, ожидая получить 5 (результат выражения), но вместо этого я получил сообщение об ошибке «Функция символа не определена».

emacs -e "(+ 2 3)"

Итак, что я сделал не так? Каков правильный способ быстро оценить выражение без необходимости действительно открывать emacs?

благодаря


2
2017-11-10 05:45


Источник




Ответы:


Что вы ищете, это Emacs ' пакетный режим, который инструктирует Emacs выполнить данную программу Lisp (независимо от того, задана ли она -l FILE, -f FUNCTION, или --eval FORM), а затем выйти. Из Справочное руководство GNU Emacs Lisp:

Параметр командной строки '-batch' заставляет Emacs работать невзаимодействующим образом. В этом режиме Emacs не считывает команды с терминала, он не изменяет режимы терминала, и он не ожидает вывода на стираемый экран. Идея заключается в том, что вы указываете программы Lisp для запуска; Когда они закончатся, Emacs должен выйти. Способ указания запущенных программ - это «-l-файл», который загружает библиотеку с именем file или «-f function», которая вызывает функция без аргументов, или «- прежняя форма».

Любой вывод программы Lisp, который обычно переходит в область эха, используя либо сообщение, или используя prin1 и т. Д., С t как поток, вместо этого переходит в стандартный дескриптор ошибок Emacs в пакетном режиме. Аналогично, ввод, который обычно поступает из минибуфера, считывается из стандартного дескриптора ввода. Таким образом, Emacs ведет себя как неинтерактивная прикладная программа. (Выход эхо-области, который обычно генерирует Emacs, например, эхо-команда, полностью подавляется.)

И для быстрого примера:

me@host $ emacs -batch --eval '(message (format "1+2 equals %d" (+ 1 2)))'
1+2 equals 3
me@host $ 

4
2017-11-12 18:10





Если вы используете GNU Emacs, то синтаксис параметра командной строки, который оценивает sexp, таков (из руководства Emacs, узла Action Arguments):

`--eval=EXPRESSION'
`--execute=EXPRESSION'
     Evaluate Lisp expression EXPRESSION.

То есть вы можете использовать --eval=... или --execute=..., AFAIK, вы не могу использование -e...,

Однако вы можете использовать -e... (или --eval) с emacsclient, Например.: emacsclient -e (text-mode)

(Лучше всего указать точное сообщение об ошибке, которое вы получаете, а также версию Emacs, чтобы получить максимальную помощь).


2
2017-11-10 17:26