首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >谁能把下面的LISP程序语句翻译成通俗易懂的英语?

谁能把下面的LISP程序语句翻译成通俗易懂的英语?
EN

Stack Overflow用户
提问于 2020-06-24 22:06:07
回答 2查看 86关注 0票数 0
代码语言:javascript
运行
复制
(define substitute (lambda (exp1 var exp2)
  (cond ((atom exp2) (cond ((eq exp2 var) exp1) (true exp2)))
     (true (cons (substitute exp1 var (car exp2)) 
         (substitute exp1 var (cdr exp2)))))))
(define substitute-and-eval (lambda (x y z) (eval (substitute x y z))))

我知道eq exp2 var正在检查exp2的内存地址,并将驻留在那里的位模式与驻留在var的内存空间中的位模式进行比较。

但是,在语句((eq exp2 var) exp1)中,(eq exp2 var)exp1之间的关系是什么呢

EN

回答 2

Stack Overflow用户

发布于 2020-06-26 18:33:44

代码语言:javascript
运行
复制
(define substitute
  (lambda (exp1 var exp2)
    (if (atom exp2)
        (if (eq exp2 var) exp1 exp2)
        (cons (substitute exp1 var (car exp2)) 
              (substitute exp1 var (cdr exp2))))))

substituteexp2中出现的var替换为exp1

但是,要考虑到这没有进行正确的替换(因此求值将返回错误的值),因为它没有考虑name conflicst --它应该生成fresh variables

票数 2
EN

Stack Overflow用户

发布于 2020-06-25 18:27:24

一种更清晰的(IMO)格式(即使它不被认为是“标准”)可以是

代码语言:javascript
运行
复制
(define substitute 
   (lambda (exp1 var exp2)
      (cond 
         ((atom exp2) 
             (cond 
                 ((eq exp2 var) exp1) 
                 (true          exp2)))
         (true 
            (cons (substitute exp1 var (car exp2)) 
                  (substitute exp1 var (cdr exp2)))))))

(define substitute-and-eval 
   (lambda (x y z) 
      (eval (substitute x y z))))

在方案中,(cond (test1 body11 ...) ...)是有条件的。

我们将逐一考虑(testN bodyN1 ...)子句。如果testN的计算结果为非False值,则会逐个计算表达式bodyN1 ...,最后一个表达式的值将作为整个cond的值返回。

如您所见,这里有两个嵌套的cond,如果(atom exp2)返回#t,则考虑使用(eq exp2 var)。如果它的值是#texp1的值将作为整个表达式(和函数)的值返回,因为每个cond都在尾部位置。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62556999

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档