标签: syntax-rules

了解Scheme宏的来源:define-syntax和syntax-rules

我已经阅读了JRM的非常偏心的语法规则入门,它帮助我理解了语法规则以及它与common-lisp的define-macro的不同之处.syntax-rules只是在define-syntax中实现语法转换器的一种方法.

我正在寻找两件事,第一件是语法规则的更多示例和解释,第二件是学习使用define-syntax的其他方法的好资料.你推荐什么资源?

lisp macros scheme syntax-rules define-syntax

10
推荐指数
2
解决办法
5687
查看次数

我怎样才能紧密实现?:来自Python中的C++/C#?

在C#中,我可以轻松编写以下内容:

string stringValue = string.IsNullOrEmpty( otherString ) ? defaultString : otherString;
Run Code Online (Sandbox Code Playgroud)

有没有快速的方法在Python中做同样的事情或我坚持使用'if'语句?

python syntax syntax-rules ternary-operator

9
推荐指数
2
解决办法
1311
查看次数

Python中"|"符号的含义是什么?

这个问题最初问(错误地)是什么"|" 在Python中,当实际问题是关于Django时.这个问题得到了我希望保留的Triptych的精彩答案.

python syntax-rules

7
推荐指数
1
解决办法
6667
查看次数

如何在语法规则中使用矢量模式?

我一直在编写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)

是否有某种技术使用这些模式?

谢谢!

lisp macros scheme syntax-rules define-syntax

6
推荐指数
1
解决办法
195
查看次数

Scheme中使用语法规则进行隐式currying?

Jeffrey Meunier 在这里有一个隐含的Curry宏,它使用defmacro.我想知道是否有人用语法规则编写了这个?

macros scheme functional-programming syntax-rules currying

5
推荐指数
1
解决办法
435
查看次数

Emacs Lisp语法高亮

我想为Emacs写一个突出显示扩展名的语法,但是我在谷歌搜索"emacs语法高亮教程"的变种都失败了.我如何学习如何编写Emacs荧光笔?有什么好的资源可以学习如何做这些事情?

emacs elisp syntax-highlighting syntax-rules

5
推荐指数
2
解决办法
3617
查看次数

语法规则不完全卫生?

我知道这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. 为什么,如果宏观系统应该是卫生的?

macros scheme syntax-rules

5
推荐指数
1
解决办法
144
查看次数

是否可以在 Common Lisp 中定义语法规则宏

我了解到在方案中定义一个小宏很容易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 common-lisp syntax-rules

4
推荐指数
1
解决办法
153
查看次数

请在Scheme中重构我的宏

我正在学习卫生,我试图在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)

macros scheme for-loop functional-programming syntax-rules

3
推荐指数
1
解决办法
349
查看次数

方案:如何在不带括号的语法规则中扩展具有多个变量的模式

我正在尝试在 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)

macros scheme syntax-rules

3
推荐指数
1
解决办法
415
查看次数