2014-10-25 2 views
1

Мне тяжело читать/понимать синтаксис инструкции pcase в emacs-lisp. Пожалуйста, помогите мне выяснить, как сделать следующее действительное заявление pcase.emacs lisp pcase error

(defun execute-play (str) 
    (setq parse (mapcar (lambda (s) (split-string s ":")) (split-string str " "))) 
    (pcase (string-to-char (caar parse))`` 
     ((pred (<= (string-to-char "5"))) (t-to-pparse)) 
     ((pred (<= (string-to-char "d"))) (f-to-p parse)) 
     ((string-to-char "w") (w-to-p parse)) 
     (_ "bad input"))) 

Обратите внимание, что типичный ввод «1: 2 3» или «a 5».

Ошибка из Emacs, что я получаю это: 'edebug-signal: Unknown upattern '(string-to-char w)' Это второй по последнему делу, - я думал, что это будет просто соответствовать значению (caar parse) против (string-to-char "w"), если он уже не соответствует дело до этого. Обратите внимание, что я также попытался заменить (string-to-char "w") с (SELFQUOTING (string-to-char "w")) поскольку документация говорит, что: SELFQUOTING matches itself. This includes keywords, numbers, and strings.

Пожалуйста, помогите мне получить эту EMACS-лисповского pcase заявления работы - Спасибо за помощь!

+1

Не задавайте 'setq' для переменной (например,' parse'), которую вы не объявили локально. Вместо этого используйте 'let'. – Stefan

ответ

1

Есть несколько проблем с вашим кодом:

  1. Поскольку вы не делаете какой-либо привязки или деконструкции в вашей модели, вам не нужно pcase - условная лучше написана с использованием cond.
  2. У вас есть паразитная пара обратных кавычек в конце линии 3.
  3. Вы кажетесь перевернули первые два теста - первый пункт будет соответствовать, если выражению больше ?5, поэтому остальные пункты не будут соответствовать ,
  4. pcase, похоже, не поддерживает сопоставление с оцененными значениями, поэтому третье предложение должно быть написано (pred (equal (string-to-char "0"))).