Tôi đang đọc Let Over Lambda, đề cập đến một số tác giả macro phân lớp khá sâu. Thật hấp dẫn và tôi chủ yếu là quản lý để theo kịp nó.Common Lisp Double-Backquote, Unquote, Trích dẫn, Unquote trình tự?
Trong Chương 4 Hoyte thực hiện macro đọc trận đấu CL-PPCRE và thay thế chức năng, chẳng hạn mà bạn có thể làm những việc như:
(#~m/(foo|bar)\d+/ "Some foo99") ; matches!
(#~s/foo(\d+)/bar\1/, "Some foo99") ; "Some bar99
Để đạt được điều này, chúng ta định nghĩa một macro mà sử dụng đôi backquote, vì nó thực sự được mở rộng bởi một macro bao bọc, cần giá trị được trích dẫn (nó trả về một dạng lambda). Trong danh sách được trích dẫn gần đây, có một số sử dụng chuỗi sau ,',varname
, mà tôi không thể có được đầu của tôi xung quanh. ,'
ban đầu làm gì ở đây?
(defmacro! pcre/match-lambda-form (o!args)
"Expands to a lambda that applies CL-PPCRE:SCAN"
``(lambda (,',g!str)
(cl-ppcre:scan ,(car ,g!args)
,',g!str)))
Trên thực tế, nó có thể là tốt hơn mà tôi chưng cất mà xuống đến một cái gì đó mà chỉ sử dụng defmacro
, cho rõ ràng nếu bạn chưa đọc cuốn sách. str
là một biểu tượng và args
là danh sách:
(defmacro pcre/match-lambda-form (args)
"Expands to a lambda that applies CL-PPCRE:SCAN"
``(lambda (,',str)
(cl-ppcre:scan ,(car ,args)
,',str)))
Are có dấu ngoặc kép về cơ bản đúp trích dẫn những phần bên trong, do đó kết quả có thể không thể viện chứng hai lần? Đặt hiệu quả 'str
vào biểu mẫu được mở rộng thay vì chỉ str
?
EDIT | Nhờ Terje D. và một số chơi xung quanh trong REPL, đây là khá nhiều tình huống:
(defvar a 42)
(equal ``(,,a) '(list 42)) ; T
(equal ``(,a) '(list a)) ; T
(equal ``(,',a) ''(42)) ; T
(equal ``(a) ''(a)) ; T (obviously)
Vì vậy:
- Gấp đôi-không thể viện chứng, hình thức là hoàn toàn mở rộng.
- Biểu mẫu không được bỏ phiếu, không được mở rộng.
- Không được đánh dấu bằng dấu phẩy, biểu mẫu được mở rộng hoàn toàn và kết quả được trích dẫn.
tài liệu tham khảo defmacro cuối cùng của bạn 'str'. Nó là gì? Nó được định nghĩa ở đâu? Bạn có thể chỉ ra cách 'pcre/match-lambda-form' được gọi không? –
Argh, điều này sẽ mất một số giải thích vì có nhiều lớp macro đang diễn ra trong thực tế. Cuốn sách này đang đẩy ranh giới với việc tạo ra macro (cho vui, và cho giáo dục).'str' là một biểu tượng đã được định nghĩa bởi một' LET' kèm theo và đại diện cho một tên biến an toàn để sử dụng. – d11wtq
'pcre/match-lambda-form' được gọi như sau:' (pcre/match-lambda-form '("foo")) ', trong đó' "foo" 'đã được đọc bởi một chuỗi xử lý luồng đọc của biểu mẫu '# ~ m/foo /'. – d11wtq