Syntax 在公共Lisp字符串中取消转义双引号

Syntax 在公共Lisp字符串中取消转义双引号,syntax,lisp,common-lisp,Syntax,Lisp,Common Lisp,要生成用于uiop:run命令的字符串命令,我需要一个包含其他字符串的字符串(如所述命令所需)。但是,该命令(Fontforg的传统脚本语言)要求某些字符串用双引号括起来,例如: “fontforge-lang=ff-c'打印(“双引号字符串”)” 我怎样才能得到这样一个字符串,而“双引号字符串”是命令字符串的一部分,也就是说,并没有双引号被转义 更新 更具体地说,我想发送给uiop:run命令的命令是fontforge-lang=ff-c'Open($1);选择全部();foreach打印(

要生成用于
uiop:run命令的字符串命令,我需要一个包含其他字符串的字符串(如所述命令所需)。但是,该命令(Fontforg的传统脚本语言)要求某些字符串用双引号括起来,例如:

“fontforge-lang=ff-c'打印(“双引号字符串”)”
我怎样才能得到这样一个字符串,而“双引号字符串”是命令字符串的一部分,也就是说,并没有双引号被转义

更新

更具体地说,我想发送给
uiop:run命令的命令是
fontforge-lang=ff-c'Open($1);选择全部();foreach打印(GlyphInfo(“名称”));endloop'haydn-11.svg
,其中GlyphInfo的
“Name”
参数应使用双引号编写。使用转义字符反斜杠保留引号

(uiop:运行程序
(无格式)
“fontforge-lang=ff-c'Open($1);SelectAll();foreach打印(GlyphInfo(\“Name\”);endloop'haydn-11.svg”)
:输出(t)
子流程命令退出,错误代码为1:

带有命令“fontforge-lang=ff-c”Open($1)的子流程;SelectAll();foreach打印(GlyphInfo(\“Name\”);endloop“haydn-11.svg” 已退出,错误代码为1 [UIOP/RUN-PROGRAM类型的条件:子流程错误]
我认为该命令也看到转义字符,这就是它无法执行的原因,否则该命令在语法上是正确的。

使用:

反斜杠是标准语法中的单个转义字符

也就是说,你要找的是

"fontforge -lang=ff -c 'Print(\"A Doublequote String\")'"
请注意,默认情况下为
t
,即,即使字符串本身不包含反斜杠,也会使用反斜杠打印上述字符串:

(defparameter s (string #\"))
s
==> "\""
(length s)
==> 1
(char s 0)
==> #\"

我没有
fontforge
,但我可以做同样的事情。首先,你做这件事的方式不是一个,而是两个级别的字符串语言:shell语言在CL中是一个字符串,任何
fontforge
语言在shell语言中都是一个字符串。因此,让我们尽量避免使用整个shell语言。我们仍然有一个级别的字符串语言,但这比两个级别要好得多

我也不明白你为什么要用
(格式为nil)
来制作。。。固定的字符串。我猜最终您打算使用
格式
替换文件名,但这是不必要的,因为我们将不再使用shell

所以,你应该这样做

(defun runit (file)
  (uiop:run-program
   (list "echo"                         ; because I don't have fontforge
        "fontforge" "-lang=ff" "-c"
        "Open($1); SelectAll(); foreach Print(GlyphInfo(\"Name\")); endloop"
        file)
   :output t
   :force-shell nil))
注意,这里的命令是
echo
:因为我没有
fontforge
,所以我只需要让
echo
打印命令行。我还在fontforge使用的任何语言的大块中添加了一些空格,以使其更清晰

所以现在

> (runit "foo.svg")
fontforge -lang=ff -c Open($1); SelectAll(); foreach Print(GlyphInfo("Name")); endloop foo.svg
nil
nil
0
这很好,虽然不清楚各个参数是什么,因为
echo
不这样做。嗯,我有一个名为
argv
的小实用程序,它的全部任务是清晰地打印它的argv,所以重写
runit

(defun runit (file)
  (uiop:run-program
   (list "argv"                         ; because I don't have fontforge
        "fontforge" "-lang=ff" "-c"
        "Open($1); SelectAll(); foreach Print(GlyphInfo(\"Name\")); endloop"
        file)
   :output t
   :force-shell nil))
我们得到

> (runit "foo.svg")
"fontforge"
"-lang=ff"
"-c"
"Open($1); SelectAll(); foreach Print(GlyphInfo("Name")); endloop"
"foo.svg"
nil
nil
0

请注意,
argv
不够聪明,无法转义长参数中的引号:它只是我用来调试东西的一个非常小的Perl脚本。

这是我首先做的,但是转义\包含在结果字符串中,这会导致命令无效(synthetic)。请参阅上面的更新。转义符不在字符串中:
(char“\”0)
\\\”
:双引号字符,
(length“\”)
1