了解Scheme功能

时间:2016-09-17 16:56:50

标签: lambda scheme racket

我们的编程语言练习考试中提供了以下问题,我很难理解其工作原理。有人能告诉我代码流是什么吗?我用球拍跑了,知道答案是什么。看起来第一个lambda函数将另外两个函数作为参数。但是输入(lambda (x) 2)(lambda (y) 3)传递到哪里?

(((lambda (x y) (x y)) (lambda (y) (lambda (y x) (x (x y)))) (lambda (x) (lambda (x y) (x (y x))))) (lambda (x) 2) (lambda (y) 3))

问题的答案是3。

3 个答案:

答案 0 :(得分:6)

我们人类喜欢为事物命名。短名称的简洁符号使得在心理上操作代码变得容易,因为我们的大部分心理能力都与我们的大规模并行视觉识别系统相关联:

(((lambda (x y) (x y))
  (lambda (y) (lambda (y x) (x (x y))))
  (lambda (x) (lambda (x y) (x (y x)))))
 (lambda (x) 2)
 (lambda (y) 3)) =>

((u               where u = (lambda (x y) (x y))
  f                     f = (lambda (y) (lambda (y x) (x (x y))))
  g)                    g = (lambda (x) (lambda (x y) (x (y x))))
 (lambda (x) 2)
 (lambda (y) 3)) =>

((u               where (u x y) = (x y)
  f                     (f y)   = \(y x) -> (x (x y))     ; (*)
  g)                    (g x)   = \(x y) -> (x (y x))
 (lambda (x) 2)
 (lambda (y) 3)) =>

((f               where (f g)   = \(y x) -> (x (x y))
  g)                    (g x)   = \(x y) -> (x (y x))
 (lambda (x) 2)
 (lambda (y) 3)) =>

(h                where h       = \(y x) -> (x (x y))
 p                      p       = \(x) -> 2
 q) =>                  q       = \(y) -> 3

(h                where (h y x) = (x (x y))
 p                      (p x)   = 2
 q) =>                  (q y)   = 3

(q (q p))         where (p x)   = 2
                        (q y)   = 3
    => 

(q 3)             where (q y)   = 3
    => 

3

(*)定义在lambda表达式(lambda (y x) (x (x y)))中包含绑定的所有变量 - xyy中的参数(f y)因此被忽略。它会被lambda表达式中的 free 变量y引用,但是没有。

答案 1 :(得分:4)

这是代数步进器的工作!

在DrRacket的交互窗口中输入此(无#lang行)。 在左下角将语言更改为"中级学生使用Lambda"。现在点击"运行"按钮。最后点击" Stepper"按钮(运行按钮左侧最左侧的按钮。

您现在可以单步执行该程序(并返回!)。

<div class="form-group <?php /**if validation error for this element then*/ echo 'has-error'; ?>">
    <label for="name">Name</label>
    <div class="validation-error">
        <?php echo form_error ( 'name' ); ?>
    </div>
    <div class="input-group">
        <div class="input-group-addon"><span class="glyphicon glyphicon-user" aria-hidden="true"></span></div>
        <input id="name" type="text" class="form-control validate" name="name" placeholder="Your full name" value="<?php echo set_value('name'); ?>">
    </div>
</div>

enter image description here

答案 2 :(得分:1)

  

但是那时输入(lambda(x)2)和(lambda(y)3)在哪里   传递到?

为此,添加println语句可以提供帮助:

(((lambda (x y)
    (println "In Lxy fn")
    (x y))
  (lambda (y)
    (println "In Ly fn")
    (lambda (y x)
      (println "In Lyxi fn")
      (x (x y))))
  (lambda (x)
    (println "In Lx fn")
    (lambda (x y)
      (println "In Lxyi fn")
      (x (y x)))))
 (lambda (x) 2)
 (lambda (y) 3))

输出:

"In Lxy fn"
"In Ly fn"
"In Lyxi fn"
3

此功能的一部分是冗余的,可以删除而不会对输出产生任何影响。在下文中,字面上可以放置任何值而不是删除的部分:

(((lambda (x y)
    (println "In Lxy fn")
    (x y))
  (lambda (y)
    (println "In Ly fn")
    (lambda (y x)
      (println "In Lyxi fn")
      (x (x y))))
  ;(lambda (x)
  ;  (println "In Lx fn")
  ;  (lambda (x y)
  ;    (println "In Lxyi fn")
  ;    (x (y x))))
  "any value"
  )
 (lambda (x) 2)
 (lambda (y) 3)) 

以您自己的格式,以下产生与以前相同的输出:

(((lambda (x y) (x y))
  (lambda (y) (lambda (y x) (x (x y))))
  ;(lambda (x) (lambda (x y) (x (y x))))
  "any value"
  )
 (lambda (x) 2)
 (lambda (y) 3))