函数式编程替代了Lisp中的while/break

Tal*_*Kit 1 lisp emacs functional-programming elisp

有一个字符串列表.想法是编写一个迭代字符串列表的函数,如果找到匹配则返回字符串名称,否则nil.这可以用语言编写

string match-string(tmp)
{
    for (int i = 0; i < stringList.size(); ++i)
    {
       if (tmp == stringList.at(i))
           return tmp;
    }
    return string(); // null string
}
Run Code Online (Sandbox Code Playgroud)

在这篇文章中提到通常循环不在Lisp中使用,必须有一个功能方式.有什么功能可以做到这一点?

gsg*_*gsg 5

在Lisp中绝对使用循环.在Lisp中,循环更有吸引力,例如Emacs Lisp和Common Lisp,它们不能保证尾部消除.

如果你坚持写功能,你可以这样做.它可能看起来像这样:

(defun find-string (string list)
  (if (null list)
      nil
    (if (equal string (car list))
        (car list)
      (find-string string (cdr list)))))
Run Code Online (Sandbox Code Playgroud)

但是在Emacs Lisp中,这段代码不会从尾部调用消除中受益,并且可能运行缓慢或烧坏堆栈.使用循环可能更好:

(defun find-string (string list)
  (loop for s in list
        when (equal s string) return s))
Run Code Online (Sandbox Code Playgroud)