2013-07-18 6 views
9

Mi piacerebbe fareElisp destructuring-bind per contro cella?

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

Ma bounds-of-thing-at-point restituisce una cella contro e non una lista, in modo da destructuring-bind non funziona. Cosa potrebbe funzionare per questo caso?

+2

'(destrutturazione-bind (inizio. Fine) (cons 'x' y) (messaggio "% s% s"))' funziona per me. Che versione di Emacs è quella? –

+0

Funziona perfettamente, @wvxvw. Non pensavo di usare il punto. Ma la docstring non era molto istruttiva. Puoi pubblicare la risposta in modo che io possa accettare? –

risposta

17

Dal destructuring-bind è una macro da cl pacchetto, può valere la pena di esaminare la documentazione Common Lisp per altri esempi .

This page mostra la sintassi della macro. Nota il (wholevar reqvars optvars . var). Anche se non sono sicuro che la versione cl di destructuring-bind supporti effettivamente tutti i casi meno comuni (molte parole chiave hanno senso solo se usate con macro/funzioni Common Lisp, ma non hanno questo significato in Emacs Lisp).

Così:

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

dovrebbe funzionare.

2

Non riesco a pensare a qualcosa di elegante come destrutturazione-bind, ma questo dovrebbe funzionare:

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

Hai memorizzato i limiti su 'b', poi ho provato ad accedervi da' x'. – Tyler

+1

corretto! Grazie per avermelo fatto notare (comunque, la risposta di wvxvw è migliore, in quanto riguarda specificamente ciò che abo-abo stava cercando di fare) – juanleon

3

userei

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