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