2009-11-05 22 views
12

Como se explica en el artículo Wikipedia, begin en Scheme es una forma de biblioteca que se puede volver a escribir utilizando formularios más fundamentales como lambda.¿Cómo se puede reescribir "comenzar" en Scheme?

¿Pero cómo reescribe un begin, especialmente teniendo en cuenta lo siguiente?

x 
===> error: undefined identifier: x 
(begin (define x 28) x) 
===> 28 
x 
===> 28 

Respuesta

18

No puede. El caso es que begin tiene dos roles: uno es una secuencia un montón de expresiones de efectos laterales, y el otro es que se usa para "empalmar" resultados de macro. El hecho de que pueda usar begin con una definición como la anterior es el resultado de esta segunda característica, y no puede escribirlo usted mismo.

Si realmente quiere seguir toda la historia, entonces usted podría definir begin como el macro simple que hace que sea hacer que el aspecto de secuenciación (y que de hecho puede ser implementado como tal, aunque por lo general no lo es) . Pero, debe agregar el reconocimiento explícito de begin s para empalmar definiciones (a nivel o interno). Esto significa que una implementación de macro está bien, pero realmente no puede ser una biblioteca porque el expansor de núcleo debe saberlo. (Y debido a que el lenguaje tiene un alcance léxico, no hay una buena forma para que el expansor núcleo identifique begin s que no están definidos en el lenguaje central.)

Para resumir todo esto, podría decir que R5RS solo está mal clasificando begin como "sintaxis de biblioteca", ya que no se puede definir en una biblioteca ... pero incluso eso no es del todo exacto ya que R5RS define "sintaxis de biblioteca" como solo "expresiones derivadas". El verdadero punto equivocado es, por lo tanto, el hecho de que una de las dos caras de begin se implementa en otro lugar, en el expansor (para contextos de definición).

Tenga en cuenta también que R6RS aclara todo: las dos caras de begin se hacen explícitas, y ahora es parte del lenguaje central, no una "forma de biblioteca", ni siquiera una forma derivada.

+0

Entonces, ¿por qué se considera una "sintaxis de biblioteca", y no simplemente "sintaxis" en R5RS? Pensé que podrías reescribir los formularios de la biblioteca solo con formularios fundamentales. – eljenso

+2

Eso es un error (junto con el artículo de wikipedia). –

+0

[citación necesitada] – Javier

2

Aún puede intentar escribir una versión de begin que satisfaga su primer rol: la secuenciación.

(define-syntax sequencing 
    (syntax-rules() 
    [(_ expression) expression] 
    [(_ expression expressions ...) 
    ((lambda (ignored) (sequencing expressions ...)) expression)])) 

Aquí está la publicación de la que tomé ese fragmento. Proporciona un contexto mejor si es interested, y puede ser.