在C#中,我可以轻松编写以下内容:
string stringValue = string.IsNullOrEmpty( otherString ) ? defaultString : otherString;
Run Code Online (Sandbox Code Playgroud)
有没有快速的方法在Python中做同样的事情或我坚持使用'if'语句?
这个问题最初问(错误地)是什么"|" 在Python中,当实际问题是关于Django时.这个问题得到了我希望保留的Triptych的精彩答案.
我一直在编写Common Lisp宏,所以Scheme的R5Rs宏对我来说有点不自然.我想我有了这个想法,除了我不明白如何在语法规则中使用矢量模式:
(define-syntax mac
(syntax-rules ()
((mac #(a b c d))
(let ()
(display a)
(newline)
(display d)
(newline)))))
(expand '(mac #(1 2 3 4))) ;; Chicken's expand-full extension shows macroexpansion
=> (let746 () (display747 1) (newline748) (display747 4) (newline748))
Run Code Online (Sandbox Code Playgroud)
我不知道我是如何使用一个需要将其参数写成向量的宏:
(mac #(1 2 3 4))
=>
1
4
Run Code Online (Sandbox Code Playgroud)
是否有某种技术使用这些模式?
谢谢!
Jeffrey Meunier 在这里有一个隐含的Curry宏,它使用defmacro.我想知道是否有人用语法规则编写了这个?
我想为Emacs写一个突出显示扩展名的语法,但是我在谷歌搜索"emacs语法高亮教程"的变种都失败了.我如何学习如何编写Emacs荧光笔?有什么好的资源可以学习如何做这些事情?
我知道这syntax-rules是一个卫生的宏观系统,但我不明白为什么会发生这种情况:
(define not (lambda (x) x))
(define-syntax nand
(syntax-rules ()
((_ a b)
(not (and a b)))))
(nand #f #t)
==> #f
Run Code Online (Sandbox Code Playgroud)
现在,如果我not 在定义宏后重新定义,则(nand #f #t)返回#t. 为什么,如果宏观系统应该是卫生的?
我了解到在方案中定义一个小宏很容易syntax-rules。是否可以定义一个宏来返回一个可以在 Common Lisp 中syntax-rules读取的列表?defmacro
这可能会像这样工作:
(defmacro and (&rest rest)
(syntax-rules (rest) ()
((_) t)
((_ x) x
((_ x y) (if x (if y y nil) nil))
((_ x y ...) (if x (and y ...) nil))))
Run Code Online (Sandbox Code Playgroud) 我正在学习卫生,我试图在Scheme中进行简单的for循环.我想支持三种结构,如下例所示
(for i = 1 : (< i 4) : (++ i)
(printf "Multiplication Table for ~s\n" i)
(for j = 1 to 5
(printf "~s * ~s = ~s\n" i j (* i j))))
Run Code Online (Sandbox Code Playgroud)
我想也支持带有这样的过滤器的循环:
(for k = 1 : 10 : (list even? (?(x) (> x 4))) : (++ k)
(print k))
Run Code Online (Sandbox Code Playgroud)
我有这个,但我可以看到很多重复.请帮我删除冗余.
(define-syntax for
(syntax-rules (= to :)
[(for x = initial : final : conditions : increment body ...)
(letrec ([loop (?(x)
(when (<= x final) …Run Code Online (Sandbox Code Playgroud) 我正在尝试在 Plan 中为 Picolisp 样式表达式编写一个宏let,我们称这个宏为let-slim。为了更简洁(如 Picolisp),我希望在仅声明一个变量时它们的用法看起来像这样
(let-slim var-name initial-value
(display var-name))
Run Code Online (Sandbox Code Playgroud)
或者类似的东西来声明任意数量的变量(请注意,这是伪代码,我实际上不会包含省略号)
(let-slim (var-name-1 initital-value-1
var-name-2 initital-value-2
...
var-name-n initital-value-n)
(+ var-name-1 var-name-2 ... var-name-n))
Run Code Online (Sandbox Code Playgroud)
第一个用例编写匹配模式相当简单syntax-rules,但后者我正在努力解决。
这不起作用,因为只会init重复
(define-syntax let-slim
(syntax-rules ()
[(_ (var init ...) body ...)
(let ((var init) ...)
body ... )]))
Run Code Online (Sandbox Code Playgroud)
这不起作用,因为它被认为是放错位置的省略号
(define-syntax let-slim
(syntax-rules ()
[(_ (var ... init ...) body ...)
(let ((var init) ...)
body ... )]))
Run Code Online (Sandbox Code Playgroud)
这不起作用,因为我需要在参考点使用括号(这意味着与内置相比,它绝对没有任何变化let)
(define-syntax let-slim
(syntax-rules ()
[(_ (var …Run Code Online (Sandbox Code Playgroud)