Scheme 此别名代码在CL中的方案等效于什么?
我正在尝试编写与此CL代码等效的方案:Scheme 此别名代码在CL中的方案等效于什么?,scheme,common-lisp,Scheme,Common Lisp,我正在尝试编写与此CL代码等效的方案: (defmacro alias (new-name prev-name) `(defmacro ,new-name (&rest args) `(,',prev-name ,@args))) ;; Sample use: (alias co concatenate) 我的目标是能够对符号和函数名使用简写名称,如: (alias sa string-append) (sa "ok" "not ok") 为了做到这一点,我尝试了这
(defmacro alias (new-name prev-name)
`(defmacro ,new-name (&rest args)
`(,',prev-name ,@args)))
;; Sample use:
(alias co concatenate)
我的目标是能够对符号和函数名使用简写名称,如:
(alias sa string-append)
(sa "ok" "not ok")
为了做到这一点,我尝试了这个方法,但没有成功:
(define-syntax alias (new-name prev-name)
`(define-syntax ,new-name (#!rest args)
`(,',prev-name ,@args)))
感谢您的帮助。谢谢。使用定义另一个
语法规则的宏,您可以轻松地执行此操作:
(define-syntax alias
(syntax-rules ()
((_ new-name prev-name)
(define-syntax new-name
(... (syntax-rules ()
((_ arg ...)
(prev-name arg ...))))))))
最棘手的事情是这个宏使用..
来避免嵌套使用..
然而,这并不一定是最好的方法。最好的方法可能取决于您精确的Scheme实现,因为Scheme不是一种语言,而是一个语言家族。编写可移植方案通常不是很有用。您可以使用定义另一个语法规则的宏来轻松实现这一点:
(define-syntax alias
(syntax-rules ()
((_ new-name prev-name)
(define-syntax new-name
(... (syntax-rules ()
((_ arg ...)
(prev-name arg ...))))))))
最棘手的事情是这个宏使用..
来避免嵌套使用..
然而,这并不一定是最好的方法。最好的方法可能取决于您精确的Scheme实现,因为Scheme不是一种语言,而是一个语言家族。编写可移植方案通常不是很有用。如果您的方案支持R6RS语法大小写和同源词(例如guile或chez方案),标识符语法是实现所需内容的最直接方式:
(define-syntax new-name (identifier-syntax old-name))
因此:
编辑:我看到你在用鸡肉。在这种情况下,您可以使用er macro transformer来复制您的defmacro解决方案(这在任何情况下都适用于chicken-4.10.0):
如果您的方案支持R6RS语法大小写和同源词(例如guile或chez方案),那么标识符语法是实现所需内容的最直接方式:
(define-syntax new-name (identifier-syntax old-name))
因此:
编辑:我看到你在用鸡肉。在这种情况下,您可以使用er macro transformer来复制您的defmacro解决方案(这在任何情况下都适用于chicken-4.10.0):
顺便说一下,在Common Lisp中,您可以通过设置表示别名的符号的symbol function
,使别名成为实函数,而不是宏,如下所示:
CL-USER> (defun foo (name)
(format nil "Hello ~A!~%" name))
FOO
CL-USER> (setf (symbol-function 'bar)
#'foo)
#<INTERPRETED-FUNCTION FOO>
CL-USER> (bar "Bob")
"Hello Bob!
"
CL-USER>(defun foo(名称)
(格式为nil“Hello~A!~%”名称)
福
CL-USER>(setf(符号功能栏)
#‘福’
#
CL-USER>(条形图“Bob”)
“你好,鲍勃!
"
顺便说一句,在Common Lisp中,您可以通过设置表示别名的符号的符号函数
,使别名成为实函数,而不是宏,如下所示:
CL-USER> (defun foo (name)
(format nil "Hello ~A!~%" name))
FOO
CL-USER> (setf (symbol-function 'bar)
#'foo)
#<INTERPRETED-FUNCTION FOO>
CL-USER> (bar "Bob")
"Hello Bob!
"
CL-USER>(defun foo(名称)
(格式为nil“Hello~A!~%”名称)
福
CL-USER>(setf(符号功能栏)
#‘福’
#
CL-USER>(条形图“Bob”)
“你好,鲍勃!
"
谢谢您的回答。当我在我的鸡方案上尝试它时,它给出了这样一个错误:错误:在(语法规则…)的扩展过程中-省略号太多:(arg…)你能帮我一下吗?顺便说一句,虽然CL上有几十本高质量的书籍和网站,但只有少数几本Scheme书籍没有那么多用处,网站和教程也很少,这限制了我的学习经验。@Romario听起来Chicken在这方面不符合R7RS,then-R7RS要求允许…
作为转义。我认为这是鸡中的一个错误,但是你的问题并没有具体说明哪种版本的方案(R5RS/R6RS/R7RS)或者你想要答案的实现。不过,为了回答您的另一个问题,我放弃了编写可移植方案的尝试,而只编写一个有能力、有良好文档记录的方案后代。当然,您也可以使用Scheme实现,但我更愿意将它们视为单独的语言。@Romario看起来Chicken Scheme在默认情况下不支持R7RS遵从性,但如果您打开它,这个答案将起作用。在我应用了R7RS扩展库(“egg”)之后,结果非常好!现在alias功能可以完美地工作。更重要的是,这是一段很好的代码,可以了解该计划的一些血淋淋的细节。顺便说一句,我的鸡肉计划版本是最新的4.13.0。我只是不认为这个版本会对这个特定的问题有什么影响:)如果你想要一个scheme教程,尽管它的目标是R6R,但它是一个很好的学习资源。另外,guile手册的其余部分也是一个很好的资源。谢谢你的回答。当我在我的鸡方案上尝试它时,它给出了这样一个错误:错误:在(语法规则…)的扩展过程中-省略号太多:(arg…)你能帮我一下吗?顺便说一句,虽然CL上有几十本高质量的书籍和网站,但只有少数几本Scheme书籍没有那么多用处,网站和教程也很少,这限制了我的学习经验。@Romario听起来Chicken在这方面不符合R7RS,then-R7RS要求允许…
作为转义。我认为这是鸡中的一个错误,但是你的问题并没有具体说明哪种版本的方案(R5RS/R6RS/R7RS)或者你想要答案的实现。不过,为了回答您的另一个问题,我放弃了编写可移植方案的尝试,而只编写一个有能力、有良好文档记录的方案后代。当然,您也可以使用Scheme实现,但我更愿意将它们视为单独的语言。@Romario看起来Chicken Scheme在默认情况下不支持R7RS遵从性,但如果您打开它,这个答案将起作用。在我应用了R7RS扩展库(“egg”)之后,结果非常好!现在alias功能可以完美地工作。更重要的是,这是一段很好的代码,可以了解该计划的一些血淋淋的细节。顺便说一句,我的鸡肉计划版本是最新的4.13.0。我只是不认为这个版本会对这个特定的问题有什么影响:)如果你想要一个scheme教程,尽管它的目标是R6R,但它是一个很好的学习资源。此外,guile手册的其余部分也是一个很好的资源。好吧,常见的Lisp等价物是使用符号宏(请参见def