Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/neo4j/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
Scheme 方案中的多行注释(RnRS)_Scheme_Comments_Lisp_Code Formatting_R5rs - Fatal编程技术网

Scheme 方案中的多行注释(RnRS)

Scheme 方案中的多行注释(RnRS),scheme,comments,lisp,code-formatting,r5rs,Scheme,Comments,Lisp,Code Formatting,R5rs,我创建了这个解决方案: ; use like this: ; (/* content ... */ <default-return>) ; or ; (/* content ... */) => #f (define-syntax /* (syntax-rules (*/) ((/* body ... */) #f) ((/* body ... */ r) r))) ;这样使用: ; (/*内容…*/) ; 或 ; (/*内容…*/)=>f (定义语法)/

我创建了这个解决方案:

; use like this:
; (/* content ... */ <default-return>)
; or
; (/* content ... */) => #f
(define-syntax /*
  (syntax-rules (*/)
    ((/* body ... */) #f)
    ((/* body ... */ r) r)))
;这样使用:
; (/*内容…*/)
; 或
; (/*内容…*/)=>f
(定义语法)/*
(语法规则(*/)
((/*正文…*/)#f)
((/*正文…*/r)r)))
但是这真的是最好的还是最简单的方法呢?

你不能这样做——它在很多情况下都不起作用。以下是一些不起作用的示例:

(+ (/* foo */) 1 2)

(define (foo a (/* b */) c) ...)

(/* foo; bar */)

(/*x*/)

(let ((x (/* 1 */) 2))
  ...)

(let ((/* (x 1) */)
      (x 2))
  ...)

(car '((/* foo */) 1 2 3))
在R5RS之前的Scheme报告中没有标准的多行注释,但R6RS添加了一种广泛使用的语法:

但是如果你真的想。。。 下面是我在评论中所说的:如果您愿意将整个代码包装在一个宏中,那么宏可以处理整个代码体,这在更多的上下文中是有效的。除了试图注释掉语法上无效的东西(如上面的分号示例或未终止的字符串)之外,它们几乎都是。你可以自己判断这是否真的值得付出努力

(就我个人而言,虽然我很喜欢这些游戏,但我仍然认为它们毫无意义。但如果你真的喜欢这些游戏,并且认为它们很有用,那么请参阅下面的家庭作业部分……)

举个例子:

(prog

 (define x 1)

 (display (+ x 2)) (newline)

 /*
 (display (+ x 10))
 /* nested comment! */
 (/ 5 0)
 */

 (define (show label /* a label to show in the output, before x */
               x /* display this (and a newline), then returns it */)
   (display label)
   (display x)
   (newline)
   x
   /* this comment doesn't prevent the function from returning x */)

 (let ([x 1] /* some comment here */ [y 2])
   (show "result = " /* now display the result of show... */
         (show "list = " (list x /* blah blah */ y)))
   'done /* just a value to return from the `let' expression */)

 (show "and ... " '(even works /* boo! */ inside a quote))

 )
作业 为了获得额外的学分,请扩展它,以便您可以注释掉不平衡的paren。例如,让这项工作:

(prog
 blah blah /* junk ( junk */ blah blah /* junk ) junk */ blah blah.
 )
显然,作为一个整体,输入应该具有平衡的参数——这意味着实现这种扩展没有多大意义。即使没有它,评论一个不平衡的帕伦又有什么意义呢


但是如果有人一路来到这里,那么你必须享受这种自我折磨。。。对吗?

麻省理工学院、Gnu、R6RS和R7RS支持这样的多行注释:

#|
    This is a comment
 |#

非常感谢!因此,我的代码可能对(cons'(/*我引用这个/*)一个foo)请给我原始的cons结构和你想评论的内容。很抱歉,您的代码示例对我来说没有意义。如果原始代码是(cons'a foo),我认为您可以这样做:(cons(/*'a*/'temp value)foo)如果您想注释'a(叹气),则只有在为不存在的问题提供较少限制的解决方案时才有意义。。。从实用的角度考虑,这是一个更糟糕的解决方案。大家都知道Scheme宏系统可以做这样的事情,但大家都知道它非常不方便——所以在语言设计方面,强迫我使用一个笨拙的结构而不是代码远远不是我所说的“优雅”、“灵活”或“多范式”。
#|
    This is a comment
 |#