Scheme 方案允许大写定义

Scheme 方案允许大写定义,scheme,lisp,racket,Scheme,Lisp,Racket,要在方案中定义正方形,我可以执行以下操作: (define (square x) (* x x) 但是,如果我使用大写字母DEFINE,我会得到一个无效的标识符: (DEFINE (square x) (* x x) 有没有一种方法可以做到以下几点 #lang sicp ; using DrRacket (define (DEFINE) define) ; sort of a macro where DEFINE expands to define 您需要使用宏来创建使用define语法的

要在方案中定义正方形,我可以执行以下操作:

(define (square x) (* x x)
但是,如果我使用大写字母DEFINE,我会得到一个无效的标识符:

(DEFINE (square x) (* x x)
有没有一种方法可以做到以下几点

#lang sicp
; using DrRacket
(define (DEFINE) define) ; sort of a macro where DEFINE expands to define

您需要使用宏来创建使用define语法的语法,并且宏需要能够以define可以采用的所有方式接受参数

对于R6RS方案:

定义‌‌ 语法 定义‌‌ 语法 定义‌‌ 语法 定义‌‌ 语法 由于R6RS Scheme define语法至少需要一个参数,因此此宏至少需要一个参数,并且它将允许上述所有使用。请注意,模式e1 e2。。。将uu与DEFINE匹配,然后与一个或多个表达式匹配:

(define-syntax DEFINE
  (syntax-rules ()
    ((_ e1 e2 ...)
     (define e1 e2 ...))))
#lang racket

(define-syntax-rule (DEFINE e1 e2 e3 ...) (define e1 e2 e3 ...))
Racket的define语法至少需要两个参数,R5RS和R7RS方案中的define也是如此。sicp语言遵循R5RS,因此lang sicp中的define也应该需要两个参数。Racket有一个方便的define-syntax规则表单,它比define-syntax更简洁,尽管两者都可以在这里使用。请注意,模式定义e1 e2 e3。。。匹配定义两个或多个表达式:

(define-syntax DEFINE
  (syntax-rules ()
    ((_ e1 e2 ...)
     (define e1 e2 ...))))
#lang racket

(define-syntax-rule (DEFINE e1 e2 e3 ...) (define e1 e2 e3 ...))
但是,sicp语言没有定义语法规则,因此我们必须满足于定义语法,使用R5RS中的模式匹配:

#lang sicp

(define-syntax DEFINE
  (syntax-rules ()
    ((_ e1 e2 e3 ...)
     (define e1 e2 e3 ...))))
最终lang sicp定义的一些示例用法:

>定义x 42 >x 42 >定义我的“添加x y+x y” >我的加12 3. >定义我的列表。xs xs >我的名单12 3 1 2 3 >定义我的参数a和b。c cons列表a b c >我的args 1 2 3 4 5 1 2 3 4 5 这两种方案中的第一种在R6RS方案中是合法的,但在R5RS或R7RS方案、lang racket或lang sicp中则不合法:

>定义x ; 定义大写。rkt:56:0:define:语法错误 ; in:{DEFINE x} >定义 ; 定义大写。rkt:57:0:define:语法错误 ; 在:{DEFINE}
您需要使用宏来创建使用define语法的语法,并且宏需要能够以define可以采用的所有方式接受参数

对于R6RS方案:

定义‌‌ 语法 定义‌‌ 语法 定义‌‌ 语法 定义‌‌ 语法 由于R6RS Scheme define语法至少需要一个参数,因此此宏至少需要一个参数,并且它将允许上述所有使用。请注意,模式e1 e2。。。将uu与DEFINE匹配,然后与一个或多个表达式匹配:

(define-syntax DEFINE
  (syntax-rules ()
    ((_ e1 e2 ...)
     (define e1 e2 ...))))
#lang racket

(define-syntax-rule (DEFINE e1 e2 e3 ...) (define e1 e2 e3 ...))
Racket的define语法至少需要两个参数,R5RS和R7RS方案中的define也是如此。sicp语言遵循R5RS,因此lang sicp中的define也应该需要两个参数。Racket有一个方便的define-syntax规则表单,它比define-syntax更简洁,尽管两者都可以在这里使用。请注意,模式定义e1 e2 e3。。。匹配定义两个或多个表达式:

(define-syntax DEFINE
  (syntax-rules ()
    ((_ e1 e2 ...)
     (define e1 e2 ...))))
#lang racket

(define-syntax-rule (DEFINE e1 e2 e3 ...) (define e1 e2 e3 ...))
但是,sicp语言没有定义语法规则,因此我们必须满足于定义语法,使用R5RS中的模式匹配:

#lang sicp

(define-syntax DEFINE
  (syntax-rules ()
    ((_ e1 e2 e3 ...)
     (define e1 e2 e3 ...))))
最终lang sicp定义的一些示例用法:

>定义x 42 >x 42 >定义我的“添加x y+x y” >我的加12 3. >定义我的列表。xs xs >我的名单12 3 1 2 3 >定义我的参数a和b。c cons列表a b c >我的args 1 2 3 4 5 1 2 3 4 5 这两种方案中的第一种在R6RS方案中是合法的,但在R5RS或R7RS方案、lang racket或lang sicp中则不合法:

>定义x ; 定义大写。rkt:56:0:define:语法错误 ; in:{DEFINE x} >定义 ; 定义大写。rkt:57:0:define:语法错误 ; 在:{DEFINE}
因为DEFINE是语法,所以不能用DEFINE来定义它。您需要将其定义为一个宏。@Barmar好的,如何使用宏来完成?请阅读另一个您可以做的事情是包装cibegin。。。围绕模块的整个主体。ci前缀将Racket的读卡器切换为不区分大小写模式,这意味着它会将为下一个s表达式读取的所有符号降格。@Ryanculpaper噢,太好了,谢谢!因为DEFINE是语法,所以不能用DEFINE来定义它。您需要将其定义为一个宏。@Barmar好的,如何使用宏来完成?请阅读另一个您可以做的事情是包装cibegin。。。围绕模块的整个主体。ci前缀将Racket的读卡器切换为不区分大小写模式,这意味着它会将为下一个s表达式读取的所有符号降格。@Ryanculpaper噢,太好了,谢谢!