напечатать символ и оценить его с помощью макроса - PullRequest
2 голосов
/ 27 февраля 2020

Я пытаюсь написать код для печати символа и оценить функцию, связанную с ним, в ракетке

Мне уже удалось добиться этого во время выполнения с помощью eval, но я думаю, что это должно быть возможно и без используя eval.

Eval версия:

(define ns (namespace-anchor->namespace a))

(define (deco-display fun-sym bstr)
  (display (symbol->string fun-sym))
  (display ": ")
  (display (eval `(,fun-sym ,bstr) ns)))

пример использования:

(define (extract-id bstr)  (subbytes bstr  0  8 ))
(deco-display 'extract-id   bstr)

Я пытался:

(define (xxx) (display "asdas"))

(define-syntax (print-and-do stx)
  (syntax-case stx ()
    [(_ p) #`(begin (display #'p) (newline) (p))]))

, но результат не что я ожидал

(print-and-do xxx)
.#<syntax:interactions from an unsaved editor:5:16 xxx>
asdas

1 Ответ

0 голосов
/ 28 февраля 2020

Благодаря комментариям и прочтению я завернул 3 рабочие версии:

(define-syntax (print-and-do-v1 stx)
  (syntax-case stx ()
    [(_ p) #'(begin (display (syntax->datum #'p)) (newline) (p))]))

(define-syntax (print-and-do-v2 stx)
  (syntax-case stx ()
    [(_ p) #'(begin (display 'p) (newline) (p))]))

(define-syntax-rule (print-and-do-v3 p)
  (begin (display 'p) (newline) (p)))
...