Elisp destruct-bind for cons cell?

时间:2013-07-18 07:44:39

标签: emacs elisp

我想做

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

但是bounds-of-thing-at-point返回一个cons单元而不是列表,所以 destructuring-bind不起作用。 什么可以适用于这种情况?

4 个答案:

答案 0 :(得分:19)

由于destructuring-bind是来自cl包的宏,因此有必要查看Common Lisp文档以获取更多示例。

This page显示宏的语法。请注意(wholevar reqvars optvars . var)。虽然我不确定cl destructuring-bind版本实际上支持所有不太常见的情况(许多关键字只有在与Common Lisp宏/函数一起使用时才有意义,但在Emacs中没有这个含义口齿不清)。

因此:

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

应该有用。

答案 1 :(得分:5)

我用

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

答案 2 :(得分:2)

我无法想象任何像destruct-bind一样优雅的东西,但这样可行:

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

答案 3 :(得分:0)

现在我们可以使用-let in dash.el。就像<select [(ngModel)]="selected" [compareWith]="compareById"> <option *ngFor="let option of options" [ngValue]="option"> {{option.text}} </option> </select> ,只是更干净一点:

options = [
  {id: 2, text: 'upper'},
  {id: 3, text: 'Lower'}
];

selected: {id: number, text: string} | undefined;

compareById = <T extends {id: number}>(x: T, y: T) => x.id === y.id;