C++ Lisp中while/break的函数式编程替代方案

C++ Lisp中while/break的函数式编程替代方案,c++,emacs,functional-programming,lisp,elisp,C++,Emacs,Functional Programming,Lisp,Elisp,有一个字符串列表。其思想是编写一个在字符串列表上迭代的函数,如果找到匹配项,则返回字符串名称,否则nil。这可以用以下语言编写: 字符串匹配字符串(tmp) { 对于(int i=0;i

有一个字符串列表。其思想是编写一个在字符串列表上迭代的函数,如果找到匹配项,则返回字符串名称,否则
nil
。这可以用以下语言编写:

字符串匹配字符串(tmp)
{
对于(int i=0;i

但有人提到,在Lisp和中通常不使用循环。实现这一点的函数方法是什么?

循环在Lisp中绝对使用。循环在诸如Emacs Lisp和Common Lisp等不能保证尾部调用消除的Lisp中更具吸引力

如果你坚持功能性写作,你可以做到。可能是这样的:

(defun find-string (string list)
  (if (null list)
      nil
    (if (equal string (car list))
        (car list)
      (find-string string (cdr list)))))
然而,在Emacs Lisp中,这段代码不会从尾部调用消除中受益,并且可能运行缓慢或破坏堆栈。使用循环可能更好:

(defun find-string (string list)
  (loop for s in list
        when (equal s string) return s))

循环在Lisp中绝对使用。循环在诸如Emacs Lisp和Common Lisp等不能保证尾部调用消除的Lisp中更具吸引力

如果你坚持功能性写作,你可以做到。可能是这样的:

(defun find-string (string list)
  (if (null list)
      nil
    (if (equal string (car list))
        (car list)
      (find-string string (cdr list)))))
然而,在Emacs Lisp中,这段代码不会从尾部调用消除中受益,并且可能运行缓慢或破坏堆栈。使用循环可能更好:

(defun find-string (string list)
  (loop for s in list
        when (equal s string) return s))
注释是正确的——您完全可以在lisp中尽早循环并返回。环很好。见鬼,Common Lisp的
loop
宏提供了一种完整的语言,用于实现多种不同的循环方式

递归是典型的替代方法,在函数式编程中更为常见;但是它是否是循环的合理替代取决于语言实现和相关代码,因为堆栈空间限制了递归深度

对于在内部将尾部递归函数优化为循环的语言,无论采用哪种方式,最终都会得到一个循环

如果您的语言没有这样的优化(例如Emacs Lisp),或者您的函数不是尾部递归的,并且您对数据没有合适的已知约束,那么您首先希望将其作为循环来编写

代码的递归版本是:

(取消我的匹配字符串(str列表)
(何时列出)
(如果(字符串等于str(车辆列表))
str
(我的匹配字符串str(cdr列表(()())))
(我的匹配字符串“foo”(“x”“y”“foo”“z”))
注释是正确的——您完全可以在lisp中尽早循环并返回。环很好。见鬼,Common Lisp的
loop
宏提供了一种完整的语言,用于实现多种不同的循环方式

递归是典型的替代方法,在函数式编程中更为常见;但是它是否是循环的合理替代取决于语言实现和相关代码,因为堆栈空间限制了递归深度

对于在内部将尾部递归函数优化为循环的语言,无论采用哪种方式,最终都会得到一个循环

如果您的语言没有这样的优化(例如Emacs Lisp),或者您的函数不是尾部递归的,并且您对数据没有合适的已知约束,那么您首先希望将其作为循环来编写

代码的递归版本是:

(取消我的匹配字符串(str列表)
(何时列出)
(如果(字符串等于str(车辆列表))
str
(我的匹配字符串str(cdr列表(()())))
(我的匹配字符串“foo”(“x”“y”“foo”“z”))

该链接并没有说lisp中没有使用循环,事实上它表明“此页面向您展示了如何在emacs lisp中退出循环。”-我相信这正是您要问的问题?我建议您回到lisp基础知识,仔细检查各种流控制结构是如何工作的。可能列出了你的LISP尝试而不是C++伪代码。@ Rabnink在链接中的前几行说:“在许多语言中,有一个“中断”或“退出”关键字,你可以用来退出循环。在功能编程中,通常你不使用循环/迭代,但有时循环只是你需要的。发布你的LISP代码——而不是C++伪代码。LISP 100%支持循环,您可以100%地“提前”退出循环。这就是为什么普通LISP有
returnfrom
return
prog
go
。但你给出的链接显示了在Elisp中使用
catch/throw
。怎么了?(答:没什么)。。。谷歌发现我:。我也不会太重视这个页面的建议w.r.t Lisp,因为他的Lisp代码非常不习惯。这个链接并没有说Lisp中没有使用循环,事实上它表明“这个页面显示了如何在emacs Lisp中退出循环。”-我相信这正是你要问的问题?我建议您回到lisp基础知识,仔细检查各种流控制结构是如何工作的。可能列出了你的LISP尝试而不是C++伪代码。@ Rabnink在链接中的前几行说:“在许多语言中,有一个“中断”或“退出”关键字,你可以用来退出循环。在功能编程中,通常你不使用循环/迭代,但有时循环只是你需要的。发布你的LISP代码——而不是C++伪代码。LISP 100%支持循环,您可以100%地“提前”退出循环。这就是为什么普通LISP有
returnfrom
return
prog
go
。但你给出的链接显示了在Elisp中使用
catch/throw
。怎么了?(答:没什么)。。。谷歌发现我:。我也不会太重视这个页面的建议w.r.t Lisp,因为他的Lisp代码非常不地道。gsg和我同时在写答案,结果发现它们非常相似,所以我通常会删除