我一直在尝试编写一个宏,除其他外,生成一个同名的编译器宏.这是我坚持的最小代码:
(defmacro definline (name lambda-list &body body)
`(define-compiler-macro ,name ,lambda-list
`(let ,,(mapcar (lambda (v) ``(,',v ,,v)) lambda-list)
,,@body)))
Run Code Online (Sandbox Code Playgroud)
我想要的是这样的:
(definline foobar (a b) (print "foobar") (+ a b))
;; Expands to
(define-compiler-macro foobar (a b)
`(let ((a ,a) (b ,b))
(print "foobar") (+ a b)))
Run Code Online (Sandbox Code Playgroud)
但我无法弄清楚如何生成let绑定((a ,a) (b ,b))
.我无法解决的问题是如何生成编译器宏表单,以便在扩展中不引用 lambda绑定的内容.我理解如何手动执行此操作,但我不确定如何对任意lambda列表执行此操作.
编辑:
经过一些更多的摆弄,我想出了这个.哪个有效.但是,它很可怕.
(defmacro definline (name lambda-list &body body)
(read-from-string
(format nil "(define-compiler-macro ~S (~{~S~^ ~})
`(let (~{(~S ,~S)~})
~{~S~}))"
name lambda-list (loop for l in lambda-list nconc …
Run Code Online (Sandbox Code Playgroud) 我正在使用Rails 4.2.3.我正在解析第三方发送的JSON(我无法控制这个JSON是如何形成的).我注意到他们偶尔会发送不好的JSON,就像这样
'{"DisplayName":""fat" Tony Elvis ","Time":null,"OverallRank":19,"AgeRank":4}'
Run Code Online (Sandbox Code Playgroud)
请注意,在上面,带有引号的"fat"这个词搞砸了JSON的其余部分.在我的Rails代码中,我解析了JSON,就像这样......
json_data = JSON.parse(content_str)
Run Code Online (Sandbox Code Playgroud)
虽然我可以在JSON无法正确解析时捕获错误,但我想知道是否有办法解释这些布置不当的引号,更正它们以便上面的字符串不构成错误的JSON,然后正确解析JSON.
有人可以解释一下,我们需要什么!!
,!!!
或者{{}}
需要什么操作员吗rlang
?我试图了解更多有关准引用的知识,但没有得到任何结果。
我已经在 Stack 上找到了几篇关于 curly-curly 运算符的帖子,并且了解我们{{
在将数据帧的变量(或对象的其他子对象)传递到函数中时使用它。但在阅读了有关引用/取消引用的内容后,我对所有这些运算符及其用法完全感到困惑。
为什么我们需要它,为什么有些函数没有它就无法读取参数,最后,它们实际上是如何工作的?
如果您以最简单的方式给出答案,即使我也能理解(也许有例子?),我将不胜感激。
我正在尝试学习LISP,并且正在通过一个代码示例,其中使用类似于以下代码的代码:
(列表'引用5)
这在REPL中评估为'5.我期望它评估为('5)或(引用5)
我在CLISP REPL中尝试这个.
任何帮助,将不胜感激.
有谁知道对字符串的外引号进行操作的 Ruby gem(或内置或本机语法,就此而言)?
我发现自己一遍又一遍地编写这样的方法:
remove_outer_quotes_if_quoted( myString, chars ) -> aString
add_outer_quotes_unless_quoted( myString, char ) -> aString
Run Code Online (Sandbox Code Playgroud)
第一个测试myString
它的开始和结束字符是否与chars
. 如果是,则返回去掉引号的字符串。否则它返回它不变。chars
默认为引号字符列表。
第二个测试myString
以查看它是否已经开始和结束char
。如果是,则返回未更改的字符串。如果不是,它返回char
前后附加的字符串,并且任何嵌入的出现char
都用反斜杠转义。char
默认为默认字符列表中的第一个。
(当然,我手工拼凑的方法没有如此冗长的名称。)
我在公共存储库中四处寻找类似的方法,但找不到类似的方法。我是唯一一个需要做很多事情的人吗?如果没有,其他人是如何做到这一点的?
我刚读过"Ada Programming",但我对如何'
在Ada中使用(单引号)感到困惑.
我可以理解,'
它用于引用属性.AAA'Image(..),BBB'Value(..)
但是,考虑到这段代码:
type Plain_Vector (Capacity : Capacity_Subtype) is record
Elements : Elements_Array (1 .. Capacity);
Last : Extended_Index := No_Index;
Busy : Natural := 0;
Lock : Natural := 0;
end record;
------------------------------------------------------------------
new Plain_Vector'(2, (Left, Right), Last => Last, others => <>)
Run Code Online (Sandbox Code Playgroud)
Q1: "new"语句的参数如何与类型的参数和记录字段匹配?
I can GUESS "2" matched "Capacity",
"(Left, Right)" matched "Elements",
"Last => Last" matched "Last"
"Others => <>" matched "Busy" and "Lock" to let them use default …
Run Code Online (Sandbox Code Playgroud) 浏览 Common Lisp 源代码时,我注意到人们最常使用#'foo
where'foo
就足够了——也就是说,无论在何处接受函数指示符,他们都会选择传递函数。
当然,#'foo
当foo
通过flet
等等定义时是必要的。我理解这一切的机制——我的问题是一种风格。难道只是因为人们不想考虑'foo
vs #'foo
,所以他们使用后者是因为前者有时不起作用?即使是这样,它也不会解释使用,#'(lambda ...)
因为#'
在那里总是不必要的。
CL 有时被称为丑陋,因为#'
,并且大多数新手没有意识到在(我敢说)大多数情况下它是不必要的。我不是新人,但我碰巧更喜欢'foo
. 为什么我不正常?如果我发布一些给funcall
and符号的代码,apply
我会被嘲笑和羞辱吗?我正在考虑在我的领域开始一个函数指示符匿名章节。我怀疑人们想要使用功能指示符,但由于同龄人的压力,他们害怕“出来”。
很久以前,我读过"数据结构是代码的一半"的引用,但是不记得我在哪里阅读它或者归结为谁.我感谢任何帮助.谢谢.
- jqr
我正在实现一个程序宏,我需要向外部提供我自己的结构。我需要quote::ToTokens
为我的结构实现特征,但我不明白如何实现。我已经尝试过这段代码但没有成功。此代码可以编译,但无效:
#[derive(Debug, Serialize, Clone)]
pub enum Enum {
A,
B,
}
impl quote::ToTokens for Enum {
fn to_tokens(&self, tokens: &mut quote::Tokens) {
tokens.append("Enum::B");
}
}
Run Code Online (Sandbox Code Playgroud)
该quote::ToTokens
示例没有解释这一点。
我需要使用 Azure 数据流表达式生成器生成 SQL 字符串,但它不允许我使用 Concat 函数在字符串之间添加单引号
我需要一个如下的 SQL 字符串
SELECT * FROM ABC WHERE myDate <= '2019-10-10'
Run Code Online (Sandbox Code Playgroud)
这里 2019-10-10 来自参数,所以我构建的表达式如下
concat('SELECT * FROM ABC WHERE myDate >=','''',$ToDate,'''')
Run Code Online (Sandbox Code Playgroud)
但上面的语句无法解析表达式。
结果将作为 SQL 查询执行。SQL 查询不允许使用双引号。它必须是单引号。
使用数据工厂表达式可以轻松实现这一点,但使用天蓝色数据流表达式则无法实现。
sql expression quote google-cloud-dataflow azure-data-factory
quote ×10
common-lisp ×3
lisp ×3
ada ×1
arguments ×1
clisp ×1
enums ×1
evaluation ×1
expression ×1
json ×1
macros ×1
new-operator ×1
parsing ×1
quasiquotes ×1
r ×1
record ×1
rlang ×1
ruby ×1
rust ×1
sql ×1
string ×1
tidyverse ×1