with pictures learn guide drracket descargar macros lisp scheme racket

pictures - Lector de macros de macros



racket scheme documentation (2)

Aquí te explicamos cómo implementar tu taquigrafía lambda:

#lang racket (define rt (make-readtable #f #/# ''non-terminating-macro (λ (c in . _) (define body (read in)) `(lambda (%) ,body)))) (parameterize ([current-readtable rt] [current-namespace (make-base-namespace)]) (eval (read (open-input-string "(#(+ 1 %) 5)")))) ;; => 6

Aquí se explica cómo implementar su ejemplo más simple, haciendo & siendo equivalente a '' :

(define rt2 (make-readtable #f #/& #/' #f)) (parameterize ([current-readtable rt2] [current-namespace (make-base-namespace)]) (eval (read (open-input-string "&(3 4 5)")))) ;; => ''(3 4 5)

¿Hay alguna manera de hacer macros de lector simple en Racket. Me refiero a una generalización como esta:

(define-reader-syntax "''" quote) ; finds expressions that start with "''" and wraps them in `(quote ...)` ''(foo) ; => (quote (foo)) ''foo ; => (quote foo)

Utilicé una sintaxis incorporada para aclarar lo que quiero decir. Una de las cosas para las que me gustaría usar esto es replicar la abreviatura lambda de clojure (#(+ 1 %) 5) ; => 6 (#(+ 1 %) 5) ; => 6

Parece que sería muy fácil simplemente definir una macro "shorthand-lambda" y asignar el prefijo "#" a eso.


Mire la entrada de la guía en las readtables lectura y las extensiones de lector para ver cómo hacer esto. Esta sección de referencia es útil también. Las extensiones de lectura son un poco más complicadas que tu ejemplo, pero son muy poderosas.

Para su problema específico, SRFI-26 proporciona una sintaxis similar para Scheme y Sam Tobin-Hochstadt escribió una elegante aplicación de macro de raqueta que implementa la versión de Scala sobre esto.