Реагируя на «неверный аргумент типа» - PullRequest
3 голосов
/ 25 марта 2012

Итак, я начинаю изучать lisp / elisp, чтобы оптимизировать свою среду emacs, и я начал создавать простую библиотеку emacs, основной контрольно-пропускной пункт которой состоит в том, чтобы определить, соответствует ли введенная скобка совпадению или нет , Я просматривал исходный код emacs (paren.el.gz) и понял, что могу использовать функцию show-paren-function, чтобы определить, соответствует она или нет.

Вот что у меня так далеко:

(defun it-is-a-paren()
  (interactive)
    (insert ")")
    (if (show-paren-function)
        (message "%s" "it is a match") 
      (message "%s" "it is not")))

Так что это довольно просто, и «это совпадение» работает так, как должно, но когда предполагается, что оно выбрасывает «это не так», это не так, вместо этого он дает мне «Неправильный аргумент типа: целое число - or-mark-p, t ".

Кто-нибудь достаточно знаком, чтобы посоветовать использовать другую функцию, или, может быть, я должен написать свою собственную вместо использования show-paren-function. Или есть способ обойти эту ошибку (вроде обработки исключений)?

Ответы [ 2 ]

4 голосов
/ 25 марта 2012

Конструкция, похожая на "обработку исключений", condition-case.

(defun its-a-paren()
  (interactive)
  (insert ")")
  (condition-case ex
      (if (show-paren-function)
          (message "its a match")
        (message "its not"))
    (error (message "its not"))))

Редактировать: Глядя на код show-paren-function, мне кажется, что эта ошибка является ошибкой, поскольку она исходит из выражения (goto-char pos), где pos равно t.

В любом случае, show-paren-function использует scan-sexps для поиска подходящей пары. Адаптируясь из того, как это делается в show-paren-function, упрощенная функция для вашего случая будет:

(defun its-a-paren()
  (interactive)
  (insert ")")
  (condition-case ()
      (progn
        (scan-sexps (point) -1)
        (message "It's a match"))
    (error (message "It's not a match"))))
2 голосов
/ 25 марта 2012

Использование функции show-paren-function для этой цели является излишним (например, проверка вашего автомобиля в гараже на предмет изменения уровня масла, чтобы определить, нужно ли автомобилю больше масла) и не работает правильно, так как вызаметил.

Я бы порекомендовал вам попробовать

(condition-case nil
    (progn (forward-sexp -1)
           (message "Moved to the matching opener"))
  (scan-error (message "No matching opener")))
...