Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.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
Clojure 宏的方案别名_Clojure_Macros_Scheme_Lisp - Fatal编程技术网

Clojure 宏的方案别名

Clojure 宏的方案别名,clojure,macros,scheme,lisp,Clojure,Macros,Scheme,Lisp,如何在Scheme中为宏创建别名 和Clojure的情况一样 这是用于公共Lisp的 我意识到它的功能 (define alias function) 但我似乎找不到或想不出如何为宏定义别名(准确地说是GNU Guile)Guile支持语法规则,因此,为“and”创建别名的可行方法如下所示: ;; define my-and as an alias for and: (define-syntax my-and (syntax-rules () [(_ arg ...)

如何在Scheme中为宏创建别名

和Clojure的情况一样

这是用于公共Lisp的

我意识到它的功能

(define alias function)

但我似乎找不到或想不出如何为宏定义别名(准确地说是GNU Guile)

Guile支持语法规则,因此,为“and”创建别名的可行方法如下所示:

;; define my-and as an alias for and:
(define-syntax my-and   
  (syntax-rules ()
    [(_ arg ...)
     (and arg ...)]))

;; try it out:
(display (my-and #t #t)) (newline)
(display (my-and #t #f)) (newline)
(display (my-and #f (/ 1 0))) (newline)
如果你真的想要一个语法别名表单,你可以。。。惊喜将其定义为宏:

;; define a 'syntax-alias' form
(define-syntax syntax-alias
  (syntax-rules ()
    [(_ newname oldname)
     (define-syntax newname
       (syntax-rules ()
         [(_ arg (... ...))
          (oldname arg (... ...))]))]))

;; use 'syntax-alias' to define 'my-and' as an alias for 'and':
(syntax-alias my-and and)

;; try it out:
(display (my-and #t #t)) (newline)
(display (my-and #t #f)) (newline)
(display (my-and #f (/ 1 0))) (newline)

在R5RS的可移植方案中,您需要制作一个宏来实现它:

(define-syntax test 
  (syntax-rules ()
    ((_ . args) (if . args))))
它有点冗长,因此您可以制作一个宏来执行以下操作:

(define-syntax define-syntax-alias
  (syntax-rules ()
    ((_ new-name old-name)
     (define-syntax new-name
       (syntax-rules ()
         ((_ . args) (old-name . args)))))))

(define-syntax-alias test if)
当然,
define syntax alias
的实现可以放在它自己的库中,并且可以在R6RS和更高版本需要它的地方重用

在一个相关的方言骗局中,一开始是Scheme,但现在已经分化为它自己的lisp语言,在标准语言中有这样的东西:

(define-syntax test (make-rename-transformer #'if))

如果您使用的方案实现支持R6RS,例如Chez方案或guile,最简单的方法是使用标识符语法创建别名:

(define-syntax new-name (identifier-syntax old-name))
标识符语法可以做的不仅仅是别名:它可以为表达式别名。因此,您可以定义**未指定**宏,如下所示:

(define-syntax **unspecified** (identifier-syntax (if #f #f)))

您的解决方案很优雅,可能解决了OP问题。但是,还应该注意,您定义的是新的宏,而不是真正的别名(即新的“名称”“引用”旧的宏)。我肯定是在定义宏。我的猜测是,对于什么是“真正的别名”没有很好的语言级别定义,不过……我认为还应该注意,在Racket中,重命名函数和宏的最简单方法是使用
(require(rename in…)
。对于上述使用
test
if
进行别名化的示例,它将是
(require(在racket/base(if-test)中重命名))
@DiiP,它适用于整个文件,但重命名转换器可以在本地使用。例如,在Greg中,您不能用导入替换它。