Emacs lisp; как да направя низ от променлива от произволен тип?

Подобни съобщения за грешки за неправилно извикани функции показват, напр.:

(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
Това е Emacs. Почти всичко, както е изложено, с примерна вградена документация.   -  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 не направи нищо (само отказа да се изпълни), така че преводът в низ беше извършен от цикъла read-eval-print, който улови грешката и я превърна в текстово съобщение. Но да, 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