【问题标题】:How to expand macros in guile scheme?如何在 guile 方案中扩展宏?
【发布时间】:2016-11-29 02:35:17
【问题描述】:

我正在尝试用诡计来写let over lambda defmacro/g!。我有这个:

(use-modules (srfi srfi-1))

(define (flatten x)
    (let rec ((x x) (acc '()))
         (cond ((null? x) acc)
               ((not (pair? x)) (cons x acc))
               (else
                (rec (car x)
                     (rec (cdr x) acc))))))

(define (g!-symbol? s)
  (and (symbol? s)
       (let ((symbol-string (symbol->string s)))
         (and (> (string-length symbol-string) 2)
              (equal? (string-downcase (substring symbol-string 0 2)) "g!")))))


(define-macro (define-macro/g! name-args . body)
    (let ((syms (delete-duplicates
                 (filter g!-symbol? (flatten body)))))
    `(define-macro ,name-args
         (let ,(map
                (lambda (s)
                  `(,s (gensym ,(substring (symbol->string s) 2))))
                syms)
           ,@body))))

但是当我尝试宏扩展define-macro/g!使用这个:

(use-modules (language tree-il))
(tree-il->scheme (macroexpand '(define-macro/g! (foo . body) `(let ((g!car ,(car body))) g!car))))

我有这个:

$15 = (if #f #f)

为什么我会得到这个结果?如何扩展define-macro/g!

【问题讨论】:

  • 我不太明白你想要达到什么目的。是否要过滤参数列表?你确定syntax-rules 不是你想要的吗?

标签: macros scheme lisp guile


【解决方案1】:

我需要使用这个代码:

(define macro '(define-macro/g! (foo . body) `(let ((g!car ,(car body))) g!car)))
(tree-il->scheme (macroexpand macro 'c '(compile load eval)))

【讨论】:

    猜你喜欢
    • 2018-10-08
    • 2020-11-21
    • 2020-09-10
    • 2020-04-08
    • 2020-10-21
    • 1970-01-01
    • 1970-01-01
    • 2016-12-11
    • 1970-01-01
    相关资源
    最近更新 更多