2013-07-18 13 views
9

Chciałbym zrobićElisp destructuring-bind dla komórki?

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

Ale bounds-of-thing-at-point zwraca komórkę minusy, a nie listy, więc destructuring-bind nie działa. Co może działać w tej sprawie?

+2

'(destructuring-bind (uruchomić. Koniec) (y cons 'x') (komunikat "% s% s"))' pracuje dla mnie. Jaka jest wersja Emacsa? –

+0

Działa idealnie, @wvxvw. Nie myślałem o używaniu kropki. Ale docstring nie był zbyt pouczający. Czy możesz opublikować odpowiedź, aby ją zaakceptować? –

Odpowiedz

17

Od destructuring-bind jest makro z cl pakietu, może warto zajrzeć do dokumentacji Common Lisp więcej przykładów .

This page wyświetla składnię makra. Zwróć uwagę na (wholevar reqvars optvars . var). Chociaż nie jestem pewien, czy cl wersja destructuring-bind faktycznie obsługuje wszystkie rzadsze przypadki (wiele słów kluczowych ma sens jedynie w przypadku makr/funkcji Common Lisp, ale nie ma to znaczenia w Emacs Lisp).

Zatem:

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

powinno działać.

2

nie mogę myśleć o niczym tak eleganckie, jak rozpad-wiążą, ale to będzie działać:

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

Zapisałeś granice do 'b', a następnie próbowałem uzyskać do nich dostęp z' x'. – Tyler

+1

Naprawiono! Dzięki za wskazanie (w każdym razie odpowiedź wvxvw jest lepsza, ponieważ odnosi się do tego, co abo-abo próbowało zrobić) – juanleon

3

użyję

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