Как мне отформатировать одну обратную косую черту в общем lisp? - PullRequest
0 голосов
/ 12 октября 2018

В настоящее время я пытаюсь получить вывод ... \hline в GNU Common lisp 2.49, но не могу заставить работать формат.Это то, что я до сих пор пытался получить одну обратную косую черту:

(format nil "\ ") => " "
(format nil "\\ ") => "\\ "
(format nil "\\\ ") => "\\ "

Я думал, что двойная обратная косая черта заставит его работать, почему обратная косая черта не выходит за пределы другой обратной косой черты?

Ответы [ 2 ]

0 голосов
/ 12 октября 2018

Обратите внимание на разницу между созданием строки и фактическим выводом в поток:

CL-USER 69 > (format nil "\\ ")
"\\ "                               ; result

CL-USER 70 > (format t "\\ ")
\                                   ; output
NIL                                 ; result

CL-USER 71 > (format *standard-output* "\\ ")
\                                   ; output
NIL                                 ; result
0 голосов
/ 12 октября 2018

См., Например:

CL-USER> (write "\\" :escape nil)
\
"\\"

Здесь выше, первая обратная косая черта - это ваша строка, напечатанная без обратной косой черты.Возвращаемым значением является строка, напечатанная REPL со стандартным синтаксисом io (http://clhs.lisp.se/Body/m_w_std_.htm),, который экранирует строки.

Итак, ваша строка содержит один обратный слеш, но печатается таким образом, чтоон может быть прочитан обратно, поэтому необходимо избегать обратной косой черты в выходной строке.

Обратите также внимание, что вызов format с NIL и одной строкой возвращает ту же строку.

Вы можетепроверить свои строки, например, сопоставив каждый символ с его именем:

(loop
   for input in '("\ " 
                  "\\ "
                  "\\\ ")
   collect (list :input input
                 :characters (map 'list #'char-name input)))

Это дает:

((:INPUT " " :CHARACTERS ("Space"))
 (:INPUT "\\ " :CHARACTERS ("REVERSE_SOLIDUS" "Space"))
 (:INPUT "\\ " :CHARACTERS ("REVERSE_SOLIDUS" "Space")))

Или просто используйте inspect:

CL-USER> (inspect "\\hline")

The object is a VECTOR of length 6.
0. #\\
1. #\h
2. #\l
3. #\i
4. #\n
5. #\e
...