gpt4 book ai didi

list - 正常函数中的反引号、反引号和反引号拼接

转载 作者:行者123 更新时间:2023-12-02 05:57:07 26 4
gpt4 key购买 nike

我仍在理解宏的过程中,虽然我认为我了解“反引号”、“取消引用”和“取消引用拼接”的基础知识,但我认为它们只在宏中使用/有用。

但是我从 Rosetta 代码( calender task )中遇到了这个 Common Lisp 代码,

(defun month-strings (year month)
"Collect all of the strings that make up a calendar for a given
MONTH and YEAR."
`(,(date-calc:center (month-to-word month) (length *day-row*))
,*day-row*
;; We can assume that a month calendar will always fit into a 7 by 6 block
;; of values. This makes it easy to format the resulting strings.
,@ (let ((days (make-array (* 7 6) :initial-element nil)))
(loop :for i :from (date-calc:day-of-week year month 1)
:for day :from 1 :to (date-calc:days-in-month year month)
:do (setf (aref days i) day))
(loop :for i :from 0 :to 5
:collect
(format nil "~{~:[ ~;~2,d~]~^ ~}"
(loop :for day :across (subseq days (* i 7) (+ 7 (* i 7)))
:append (if day (list day day) (list day))))))))

这里反引号、取消引号和取消引号拼接用于普通函数中,它用于创建字符串列表。

虽然我不使用 Scheme,但 Racket 解决方案也有类似的东西,
(define days
(let ([? (if (= mn 12) (λ(x y) y) (λ(x y) x))])
(round (/ (- (find-seconds 0 0 12 1 (? (+ 1 mn) 1) (? yr (+ 1 yr))) s)
60 60 24))))
(list* (~a mname #:width 20 #:align 'center) "Su Mo Tu We Th Fr Sa"
(map string-join
(nsplit 7 `(,@(make-list pfx " ")
,@(for/list ([d days])
(~a (+ d 1) #:width 2 #:align 'right))
,@(make-list (- 42 pfx days) " ")))))))

我没有测试。

我的问题是,

为什么这在函数中是必要的,用例是什么?

它与宏有何不同?

最佳答案

quasiquote、unquote 和 unquote-splicing 只是引用数据组合的语法糖,list , 和 cons .想象一下:

`(,a b c)    ; == (cons a '(b c))
`(a b ,c) ; == (list 'a 'b c)
`(a b ,@c d) ; == (cons 'a (cons 'b (append c '(d))))

这些都是琐碎的小例子,所以你可以想象右手边可能会变得非常复杂,但很高兴知道 quasiquote 魔术在需要时会产生新的缺点,并将文字保持在尾部。因此使用 nconc quasiquoted 表达式在第一种情况下不起作用,但在第二种和第三种情况下不起作用,因为在这些情况下最后一个 cons 需要是新鲜的。

如果您有一个创建列表结构的函数,quasiquote 将使代码更加清晰简洁,因为表单看起来更像结果。它与宏没有什么不同,因为两者都创建列表结构。宏的不同之处在于结果会发生什么。在函数中返回值并在宏代码中被替换。

您可以通过 macroexpand 检查使用宏后会发生什么:
(macroexpand '`(,a ,b ,@c))
; ==> (cons a (cons b c))
; ==> t

关于list - 正常函数中的反引号、反引号和反引号拼接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48612047/

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