Как я могу выполнить частичное совпадение символов на defstruct? - PullRequest
1 голос
/ 03 февраля 2010

В этом вопросе StackOverFlow я создал базу данных сотрудников и предоставил функцию выбора по началу . Как я могу написать шаблон выбора по первому , в котором запись возвращается, если какая-либо часть строки / символа совпадает?

(select-by-first-pattern 'ev); Returns all records containing "ev" (eg. Steve)

Вот код, необходимый для построения базы данных: (ОБНОВЛЕНО: включено предлагаемое решение)

(require 'cl)
(defvar *emp-db* nil)
(defun add-record (emp) (push emp *emp-db*))

(defstruct employee age first-name last-name sex children)

(add-record (make-employee))

(add-record (make-employee :age 34
      :last-name 'farquharson
      :first-name 'alice
      :sex 'female))

(add-record (make-employee :age 43
      :last-name 'jobs
      :first-name 'steve
      :sex 'male))

(add-record (make-employee :age 53
      :last-name 'ballmer
      :first-name 'steve
      :sex 'male))

(defun select-by-first (first-name)
  (remove-if-not
   #'(lambda (employee)
       (equal (employee-first-name employee) first-name))
   *emp-db*))

;; ---------- Answer below ----------
;;
(defun select-by-first-pattern (first-name)
  (remove-if-not
   #'(lambda (employee)
       (if (string-match first-name (symbol-name (employee-first-name employee))) t nil))
   *emp-db*))

(print (select-by-first-pattern "al")); Returns alice's record
(print (select-by-first-pattern "ev")); Returns records of the two Steve's
(print (select-by-first-pattern "ee")); Returns nil

Ответы [ 2 ]

1 голос
/ 03 февраля 2010

Если вы хотите выполнить частичное или шаблонное сопоставление, вам действительно следует использовать строки. У меня нет никакого опыта работы с обычным Common Lisp, но Emacs имеет множество функций сопоставления регулярных выражений.

Если вы действительно застряли с символами в качестве входных данных, вы можете использовать symbol-name (по крайней мере, в Elisp), чтобы получить имя символа в виде строки. В любом случае, вы в конечном итоге будете сравнивать строки, так что вы можете использовать их для начала.

0 голосов
/ 05 февраля 2010

Используйте SYMBOL-NAME для преобразования символа в строку, сохранив исходный регистр:

> (symbol-name '|Alice|)
"Alice"

Для простого поиска строки вы можете использовать функцию ПОИСК:

> (search "li" (symbol-name '|Alice|))
1
> (search "li" (symbol-name '|Dave|))
NIL

Для сложного сопоставления с образцом, вероятно эта библиотека может помочь.

...