2013-07-18 41 views
9

Tôi muốn làmElisp destructuring-bind cho cons cell?

(destructuring-bind (start end) (bounds-of-thing-at-point 'symbol)) 

Nhưng bounds-of-thing-at-point trả về một tế bào khuyết điểm và không phải là một danh sách, vì vậy destructuring-bind không hoạt động. Điều gì có thể hiệu quả trong trường hợp này?

+2

'(destructuring-bind (bắt đầu. Cuối) (cons 'x' y) (thông báo "% s% s"))' làm việc cho tôi. Phiên bản Emac là gì? –

+0

Hoạt động hoàn hảo, @wvxvw. Không nghĩ đến việc sử dụng dấu chấm. Nhưng docstring không có nhiều thông tin. Bạn có thể đăng câu trả lời để tôi có thể chấp nhận không? –

Trả lời

17

Kể từ destructuring-bind là một vĩ mô từ cl gói, nó có thể là đáng giá để xem xét tài liệu Common Lisp để biết thêm ví dụ .

This page hiển thị cú pháp của macro. Lưu ý (wholevar reqvars optvars . var). Mặc dù tôi không chắc chắn phiên bản cl của destructuring-bind thực sự hỗ trợ tất cả các trường hợp ít phổ biến hơn (nhiều từ khóa chỉ có ý nghĩa khi được sử dụng với các macro/hàm Common Lisp, nhưng không có ý nghĩa đó trong Emacs Lisp).

Như vậy:

(destructuring-bind (start . end) (bounds-of-thing-at-point 'symbol) ;...) 

nên làm việc.

2

tôi không thể nghĩ về bất cứ điều gì như tao nhã như destructuring-ràng buộc, nhưng điều này sẽ làm việc:

(let* ((b (bounds-of-thing-at-point 'symbol)) 
     (start (car b)) 
     (end (cdr b))) 
    ...) 
+0

Bạn đã lưu các giới hạn vào 'b', sau đó thử truy cập chúng từ' x'. – Tyler

+1

Đã sửa lỗi! Cảm ơn bạn đã chỉ ra nó (dù sao, câu trả lời wvxvw là tốt hơn, vì nó đặc biệt giải quyết những gì abo-abo đang cố gắng làm) – juanleon

3

Tôi muốn sử dụng

(pcase-let ((`(,start . ,end) (bounds-of-thing-at-point 'symbol))) 
    ...)