gpt4 book ai didi

macros - 以编程方式填写 Scheme 中的 letrec。宏还是评估?

转载 作者:行者123 更新时间:2023-12-02 07:14:54 25 4
gpt4 key购买 nike

我只是在玩一个 NFA 来识别字符串。我有一个宏,它创建一个函数,该函数消耗输入并将其余部分传递给其他一些函数。因为我的 NFA 图中可能存在循环,所以我使用 letrec 将整个图组合在一起。这是一些代码(已在 PLT-Scheme 中测试):

(define-syntax-rule (match chars next accepting)
; a function that consumes a list of chars from a list l.
; on success (if there's more to do) invokes each of next on the remainder of l.
(lambda (l)
(let loop ((c chars) (s l))
(cond
((empty? c)
(cond
((and (empty? s) accepting) #t)
(else
(ormap (lambda (x) (x s)) next))))
((empty? s) #f)
((eq? (car c) (car s))
(loop (cdr c) (cdr s)))
(else #f)))))

; matches (a|b)*ac. e .g. '(a a b b a c)
(define (matches? l)
(letrec
([s4 (match '( ) '() #t)]
[s3 (match '(c) `(,s4) #f)]
[s2 (match '(a) `(,s3) #f)]
[s1 (match '( ) `(,s2 ,s5) #f)]
[s5 (match '( ) `(,s6 ,s7) #f)]
[s6 (match '(a) `(,s8) #f)]
[s7 (match '(b) `(,s8) #f)]
[s8 (match '( ) `(,s1) #f)])
(s1 l)))


(matches? '(a c))
(matches? '(a b b b a c))
(matches? '(z a b b b a c))

现在,如果我有一个简单的数据结构来表示我的 NFA,比如列表的列表会怎么样。例如

'((s4 () () #t)
(s3 (c) (s4) #f)
...)

我的问题是: 我如何将该列表转换为以前的 le​​trec 语句?我不太擅长宏,我的理解是我可能不应该使用 eval。

最佳答案

如果列表在编译时已知(我的意思是,在程序开始运行之前),那么您可以使用宏。否则,您必须使用 eval

没关系。这是 eval 的良好用途之一。 :)

关于macros - 以编程方式填写 Scheme 中的 letrec。宏还是评估?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1895399/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com