шепелявость Emacs; как сделать строку из переменной любого типа?

Как показывают сообщения об ошибках для неправильно вызванных функций, например:

(message (file-attributes "."))

Выдает сообщение:

"eval: Wrong type argument: stringp, ("/home14/tjones" 1 0 0 (20415 35598) (20211 19255) (20211 19255) 14 "lrwxrwxrwx" t ...)"

Как вы делаете этот тип перевода намеренно, например:

(message (thing-to-string (file-attributes ".")))

Чтобы отправить что-то вроде:

("/home14/tjones" 1 0 0 (20415 35598) (20211 19255) (20211 19255) 14 "lrwxrwxrwx" t ...)

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


person mrtimdog    schedule 25.05.2012    source источник
comment
Это Эмакс. Практически все открыто, с образцовой встроенной документацией.   -  person tripleee    schedule 25.05.2012


Ответы (3)


Посмотрите на prin1-to-string и связанные с ним функции (prin1, princ и т. д.). И попробуй мануал! http://www.gnu.org/software/emacs/manual/html_node/elisp/Output-Functions.html

person tripleee    schedule 25.05.2012
comment
Согласитесь, что это, вероятно, трудно найти, если вы не знаете, что это там. - person tripleee; 25.05.2012

В вашем примере message ничего не делал (он просто отказывался запускаться), поэтому перевод в строку выполнялся циклом чтения-оценки-печати, который перехватывал ошибку и превращал ее в текстовое сообщение. Но да, message тоже может это сделать, и он делает это, вызывая format, который внутренне использует такие вещи, как prin1-to-string. Так что (format "%S" <foo>) сделает все, что вам нужно.

person Stefan    schedule 26.05.2012

Предполагается, что первым аргументом message будет строка формата (такая же, как та, которую вы передаете функции format. Если вы зададите ей формат «%s» (или «%S», как в Ответ Стефана.) он упорядочит все, что вы укажете в качестве следующего аргумента.

Версия с заглавной буквой S будет экранировать символы в строке, чтобы ее можно было снова прочитать как s-выражение. В данном случае, я думаю, это то, что вы хотите. Таким образом, вам не нужно сильно менять код, чтобы получить то, что вы ищете:

(message "%S" (file-attributes "."))
person A. Levy    schedule 02.12.2016