Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/vim/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scheme 何时在方案中使用反向报价?_Scheme_Backquote - Fatal编程技术网

Scheme 何时在方案中使用反向报价?

Scheme 何时在方案中使用反向报价?,scheme,backquote,Scheme,Backquote,对于支持R5R的方案实现,可以通过语法规则中的模式匹配来定义宏,在这种情况下,我们为什么需要反引号 我通过emacs lisp学习了一些非常基本的lisp,在elisp中,我们必须使用大量的反引号来编写宏,但是对于支持模式匹配的方案,有反引号有用吗?或者我应该问一下,在什么情况下,策划师通常会使用backquote来帮助他们解决问题?backquote在“模板化”方面非常有用。举一个简单的例子,假设我想构造一个类似html的元素,其中包含一个无序列表,其第二个元素来自一个名为占位符的程序变量。我

对于支持R5R的方案实现,可以通过语法规则中的模式匹配来定义宏,在这种情况下,我们为什么需要反引号


我通过emacs lisp学习了一些非常基本的lisp,在elisp中,我们必须使用大量的反引号来编写宏,但是对于支持模式匹配的方案,有反引号有用吗?或者我应该问一下,在什么情况下,策划师通常会使用backquote来帮助他们解决问题?

backquote在“模板化”方面非常有用。举一个简单的例子,假设我想构造一个类似html的元素,其中包含一个无序列表,其第二个元素来自一个名为
占位符的程序变量。我会这样写:

`(ul (li "the first item")
     (li ,placeholder)
     (li "the third item"))

Backquote在“模板化”中非常有用。举一个简单的例子,假设我想构造一个类似html的元素,其中包含一个无序列表,其第二个元素来自一个名为
占位符的程序变量。我会这样写:

`(ul (li "the first item")
     (li ,placeholder)
     (li "the third item"))

你让它看起来像是我们制作列表的唯一一次,那就是生成代码。事实并非如此

反引号语法只是一些文字和一些扩展的语法糖。因此,与其写:

(list 'this 'is expr)
你可以写

`(this is ,expr)
它们的目标代码几乎相同。为了回答您的问题:如果您要生成一个列表或树(列表列表),其中部分是文字,而部分不是文字,请使用
backquote
unquote
将代码简化为更易于阅读的内容,从而再次减少错误


顺便说一句:由于
语法规则
有局限性,大多数实现至少有一个可选的宏系统,它可能有
quasikote
unquote
,甚至有一个特殊的语法版本。从R6RS的
语法中,case
\`

您让我们在创建列表时似乎只有生成代码。事实并非如此

反引号语法只是一些文字和一些扩展的语法糖。因此,与其写:

(list 'this 'is expr)
你可以写

`(this is ,expr)
它们的目标代码几乎相同。为了回答您的问题:如果您要生成一个列表或树(列表列表),其中部分是文字,而部分不是文字,请使用
backquote
unquote
将代码简化为更易于阅读的内容,从而再次减少错误

顺便说一句:由于
语法规则
有局限性,大多数实现至少有一个可选的宏系统,它可能有
quasikote
unquote
,甚至有一个特殊的语法版本。从R6RS的
语法中,case
\`

quasikote(即backquote)只是运行时列表构造的语法建议

这也是一个非常有用的方法。首先,它为您提供了明显的快速列表结构,允许您快速从评估转移到报价上下文。
例如,代码
(cons(append(list a'b)c)d))
可以写成
`(,ab,@c,@d)
(unquote拼接,用
表示,@
用于追加表达式产生的列表)

其次,它允许非常快速地跟踪调试一段代码。假设您有以下代码:

(define string-split
  (lambda (s delim)
    (reverse (car (fold-left
                   (lambda (p ch)
                     (let ((str-lst (car p))
                           (char-lst (cdr p)))
                       (if (char=? ch delim)
                           (if (null? char-lst)
                               (cons str-lst '())        
                               (cons (cons (list->string (reverse char-lst)) str-lst) '()))
                           (cons str-lst (cons ch char-lst)))))
                   `(()  ())
                   (append (string->list s) `(,delim)))))))
如果使用参数
“abc def”
\space
调用它,您将从
列表->字符串中得到一个错误。很难看出哪里出了问题,哪里出了问题,但是如果你取消调用
list->string
,并取消引用(使用
)参数
charlst
,它会给你一个很好的开始提示。

quasikote(即backquote)只是运行时列表构造的语法建议

这也是一个非常有用的方法。首先,它为您提供了明显的快速列表结构,允许您快速从评估转移到报价上下文。
例如,代码
(cons(append(list a'b)c)d))
可以写成
`(,ab,@c,@d)
(unquote拼接,用
表示,@
用于追加表达式产生的列表)

其次,它允许非常快速地跟踪调试一段代码。假设您有以下代码:

(define string-split
  (lambda (s delim)
    (reverse (car (fold-left
                   (lambda (p ch)
                     (let ((str-lst (car p))
                           (char-lst (cdr p)))
                       (if (char=? ch delim)
                           (if (null? char-lst)
                               (cons str-lst '())        
                               (cons (cons (list->string (reverse char-lst)) str-lst) '()))
                           (cons str-lst (cons ch char-lst)))))
                   `(()  ())
                   (append (string->list s) `(,delim)))))))
如果使用参数
“abc def”
\space
调用它,您将从
列表->字符串中得到一个错误。很难看出哪里出了问题,哪里出了问题,但是如果您取消了对
列表->字符串的调用,并(使用
)取消了参数
char lst
,这将给您一个很好的开始提示