Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/18.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
Scheme 此别名代码在CL中的方案等效于什么?_Scheme_Common Lisp - Fatal编程技术网

Scheme 此别名代码在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") 为了做到这一点,我尝试了这

我正在尝试编写与此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") 
为了做到这一点,我尝试了这个方法,但没有成功:

(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