gpt4 book ai didi

clojure - 为clojure编写嵌套定义语句(如在方案中)的标准方法是什么?

转载 作者:行者123 更新时间:2023-12-04 01:23:16 24 4
gpt4 key购买 nike

所有示例均取自 SICP Book:http://sicpinclojure.com/?q=sicp/1-3-3-procedures-general-methods

这是来自 MIT 的 LISP 视频系列 - http://ocw.mit.edu/courses/electrical-engineering-and-computer-science/6-001-structure-and-interpretation-of-computer-programs-spring-2005/video-lectures/2a-higher-order-procedures/

在方案中,您可以将“定义”放在另一个“定义”中:

(define (close-enough? v1 v2)
(define tolerance 0.00001)
(< (abs (- v1 v2)) tolerance ) )

在 clojure 中,有一个 'let' 语句,唯一的区别是它是嵌套的:
(defn close-enough? [v1 v2]
(let [tolerance 0.00001]
(< (Math/abs (- v1 v2) )
tolerance) ) )

但是用clojure重写像这样更大的东西呢?:
(define (sqrt x)
(define (fixed-point f first-guess)
(define (close-enough? v1 v2)
(define tolerance 0.00001)
(< (abs (- v1 v2)) tolerance))
(define (try guess)
(let ((next (f guess)))
(if (close-enough? guess next)
next
(try next))))
(try first-guess))
(fixed-point (lambda (y) (average y (/ x y)))
1.0))

这确实有效,但看起来非常非常规......
(defn sqrt [n]
(let [precision 10e-6
abs #(if (< % 0) (- %) %)
close-enough? #(-> (- %1 %2) abs (< precision))
averaged-func #(/ (+ (/ n %) %) 2)
fixed-point (fn [f start]
(loop [old start
new (f start)]
(if (close-enough? old new)
new
(recur new (f new) ) ) ) )]

(fixed-point averaged-func 1) ) )

(sqrt 10)

2012 年 3 月 8 日更新

感谢你的回答!

本质上,'letfn' 与 'let' 并没有太大的不同——被调用的函数必须嵌套在 'letfn' 定义中(与 Scheme 不同,其中函数在其定义之后的下一个 sexp 中使用并且仅存在于范围内定义它的顶级函数)。

所以另一个问题......为什么clojure不提供做scheme的能力?这是某种语言设计决定吗?我喜欢计划组织的地方是:
  • 1)想法的封装,这样我作为程序员就知道哪些小块正在被使用更大的 block - 特别是如果我只在大块中使用小块一次(无论出于何种原因,即使小块本身就很有用)。
  • 2)这也停止了对最终用户无用的小程序污染命名空间(我已经编写了clojure程序,一周后回到它们并且不得不重新学习我的代码,因为它是一个扁平的结构和我觉得我是从里到外查看代码,而不是以自上而下的方式)。
  • 3) 一个通用的方法定义接口(interface),这样我就可以拉出一个特定的子方法,对其进行测试,然后将更改后的版本粘贴回去,而无需太多的摆弄。

  • 为什么这不在 clojure 中实现?

    最佳答案

    在 clojure 中编写嵌套命名过程的标准方法是使用 letfn .

    顺便说一句,您使用嵌套函数的示例非常可疑。示例中的所有函数都可以是顶级的非本地函数,因为它们本身或多或少有用,并且除了彼此之外不会关闭任何东西。

    关于clojure - 为clojure编写嵌套定义语句(如在方案中)的标准方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9890888/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com