【问题标题】:How can I perform a partial symbol match on a defstruct?如何对 defstruct 执行部分符号匹配?
【发布时间】:2010-02-03 00:13:25
【问题描述】:

在这个StackOverFlow question 中,我创建了一个员工数据库并提供了一个select-by-first 功能。如果字符串/符号的任何部分匹配,我如何编写一个 select-by-first-pattern 来返回记录?

(按第一个模式选择'ev);返回所有包含“ev”的记录(例如史蒂夫)

这是构建数据库所需的代码:(更新:包括建议的解决方案)

(需要'cl) (defvar *emp-db* 无) (defun add-record (emp) (push emp *emp-db*)) (defstruct 员工年龄名字姓氏性别儿童) (add-record (make-employee)) (add-record (make-employee :age 34 :姓氏'法夸尔森 :名字'爱丽丝 :sex '女性)) (add-record (make-employee :age 43 :last-name '工作 :first-name '史蒂夫 :性别男)) (add-record (make-employee :age 53 :姓氏'鲍尔默 :first-name '史蒂夫 :性别男)) (defun select-by-first (first-name) (删除,如果不是 #'(lambda (员工) (等于 (employee-first-name employee) firstname)) *emp-db*)) ;; ---------- 下面回答 ---------- ;; (defun select-by-first-pattern (first-name) (删除,如果不是 #'(lambda (员工) (if (string-match first-name (symbol-name (employee-first-name employee))) t nil)) *emp-db*)) (打印(按第一个模式选择“al”));返回爱丽丝的记录 (print (select-by-first-pattern "ev"));返回两个史蒂夫的记录 (打印(按第一个模式选择“ee”));返回零

【问题讨论】:

  • Common Lisp 有一个函数 STRING。对于符号,它返回名称,对于字符串,它返回字符串。

标签: elisp common-lisp


【解决方案1】:

如果你想做部分匹配或模式匹配,你真的应该使用字符串。我对 Common Lisp 本身没有任何经验,但 Emacs 具有丰富的正则表达式匹配功能。

如果您真的被符号作为输入,您可以使用symbol-name(至少在 Elisp 中)将符号的名称作为字符串获取。无论哪种方式,您最终都会比较字符串,因此您不妨先使用它们。

【讨论】:

  • symbol-name 存在于 Common Lisp 中,但它以大写形式返回字符串。 Elisp 有字符串匹配,而 CL 有不同的库。
  • 我将您的建议添加到我的问题中。问题解决了。谢谢。
  • 常见的 Lisp 符号区分大小写。如果 CL 以大写形式返回符号名称,那么因为它们是大写的。阅读器默认将 foo 转换为名称“FOO”。如果你想使用不同的情况,你需要写|Steve Jobs|,其中符号名称是字符串“Steve Jobs”。
【解决方案2】:

使用 SYMBOL-NAME 将符号转换为字符串,保留原来的大小写:

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

对于简单的字符串搜索,可以使用 SEARCH 函数:

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

对于复杂的模式匹配,this library 可能会有所帮助。

【讨论】:

    猜你喜欢
    • 2011-01-28
    • 2017-08-30
    • 2014-06-23
    • 1970-01-01
    • 2016-06-15
    • 1970-01-01
    • 1970-01-01
    • 2017-04-02
    • 1970-01-01
    相关资源
    最近更新 更多