che sto sconcertati cercando di creare l'equivalente di questo banale macro (in Common Lisp) nello Schema MIT:Come si scrive una macro Schema MIT per restituire un modulo lambda?
(defmacro funcify (exp)
`(lambda (x) ,exp))
Questo è per un semplice progetto personale, un'equazione numerica risolutore basa sulle funzioni incorporate in la seconda conferenza SICP. Non mi interessa che questa macro non sia "sicura" o "igienica" o catturerà una variabile se l'exp fa riferimento a simboli diversi da "x". Mi piacerebbe essere in grado di scrivere
(solv '(* 60 x) '(* 90 (- x 1)))
dove solv è:
(define (solv lh-exp rh-exp)
(solve (funcify lh-exp) (funcify rh-exp)))
invece di dover digitare
(solve (lambda (x) (* 60 x)) (lambda (x) (* 90 (- x 1))))
Ma non riesco a capire come fare questo usando Regole di sintassi del MIT Scheme.
Ho provato questo ma non funziona:
(define-syntax funcify
(syntax-rules()
((funcify y) (lambda (x) y))))
;Value: funcify
(funcify x)
;Value 17: #[compound-procedure 17]
((funcify x) 10)
;Unbound variable: x
Ho provato altre cose, probabilmente non vale la pena menzionare che coinvolge eval
ma senza alcun risultato.
Inoltre, i riferimenti a buoni tutorial (non referenze) sul sistema di macro di schema che iniziano con piccoli esempi semplici e si accumulano, con ampio commento, e, in particolare, mostrano come convertire le macro stile backquote-virgola LISP (che per me sono molto intuitivo) al sistema di sintassi della sintassi di Scheme sarebbe grandioso.
+1 per l'implementazione ER (supportata dallo Schema MIT). :-) –
@ ChrisJester-Young Grazie per la correzione del bug. :) –
+1. Grazie mille. define-syntax è del tutto sconcertante, ma ho il sospetto che sia molto potente, mi piacerebbe impararlo meglio, ogni riferimento a venire su a velocità su di esso? Accetto la tua risposta perché fornisce una funzionalità che funziona in MIT Scheme, vorrei poter accettare anche la risposta di Chris perché sottolinea anche che solv deve essere una macro di regole di sintassi. – Bogatyr