Đối tượng cú pháp thường được cho là chỉ serializable data. Cú pháp 3D làm suy yếu điều kiện này: nó cho phép chúng ta lẻn vào các giá trị tùy ý, và không chỉ dữ liệu đơn giản. Đó là những gì làm cho chúng "3d": chúng là những giá trị vượt lên trên những thứ phẳng bình thường mà bạn mong đợi từ các đối tượng cú pháp.
Ví dụ: chúng tôi có thể lẻn vào các giá trị lambda
!
#lang racket
(define ns (make-base-namespace))
(define (set-next! n)
(parameterize ([current-namespace ns])
(eval #`(define next #,n)))) ;; <-- 3d-syntax here
(define (compute s)
(parameterize ([current-namespace ns])
(eval s)))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(define counter 0)
(set-next! (lambda()
(set! counter (add1 counter))
counter))
(compute '(+ (next)
(next)
(next)
(next)))
Thực hiện điều này thường là một điều xấu, vì sự hiện diện của các giá trị này có thể là nỗ lực không thành công để tiết lộ thông tin trong các giai đoạn biên dịch. Kết quả là cái gì đó có khả năng không thể phân tách riêng. Nếu bạn thấy lỗi có âm như sau:
write: cannot marshal value that is embedded in compiled code value
thì rất có thể là do macro đã tạo ra một đoạn cú pháp 3d không thể được tuần tự hóa thành bytecode.
Đôi khi, trong những trường hợp hiếm hoi, chúng tôi thực sự muốn có cú pháp 3d, thường trong ngữ cảnh đánh giá động. Như một ví dụ cụ thể, một trình gỡ lỗi trong DrRacket có thể muốn chú thích cú pháp của một chương trình để các ứng dụng hàm gọi trực tiếp trở lại các chức năng của trình gỡ rối, để chúng ta có thể thực hiện những việc như tô màu mã tương tác trong trình chỉnh sửa chương trình. Theo nghĩa đó, cú pháp 3d có thể hoạt động như một kênh giao tiếp giữa mã được đánh giá động và môi trường xung quanh của nó.
Trong tương lai, có thể mọi thứ sẽ được ghi lại đầy đủ! 1 cho khó khăn. Trông giống như một câu hỏi tiền thưởng tốt cho tôi. Điều duy nhất tôi có thể xác định có liên quan là cuộc thảo luận này: http://lists.racket-lang.org/dev/archive/2013-January/011637.html – jdero