Lisp 内外还原,结果相同?

Lisp 内外还原,结果相同?,lisp,racket,operator-precedence,Lisp,Racket,Operator Precedence,内部还原和外部还原是否总是创造相同的价值,如果不是,是什么导致不同的价值 我说的是Racket,一种函数语言 我知道有一些可能性,比如在球拍中更有效,但实际上会导致不同的结果。我无法创建一个这样的案例,但我觉得这应该是可能的,也可能是。不知道很危险 例如: ;inner reduction (sqr (* 3 (+ 1 (sqr 2)))) ->(sqr (* 3 (+ 1 (* 2 2))) ;(sqr) ->(sqr (* 3 (+ 1 4

内部还原和外部还原是否总是创造相同的价值,如果不是,是什么导致不同的价值

我说的是Racket,一种函数语言

我知道有一些可能性,比如在球拍中更有效,但实际上会导致不同的结果。我无法创建一个这样的案例,但我觉得这应该是可能的,也可能是。不知道很危险

例如:

;inner reduction
    (sqr (* 3 (+ 1 (sqr 2))))
        ->(sqr (* 3 (+ 1 (* 2 2))) ;(sqr)
        ->(sqr (* 3 (+ 1 4)) ;(*)
        ->(sqr (* 3 5)) ;(+)
        ->(sqr 15) ;(*)
        ->(* 15 15) ;(sqr)
        ->225 ;(*)

;outer reduction
    (sqr (* 3 (+ 1 (sqr 2))))
        ->(* (* 3 (+ 1 (sqr 2))) (* 3 (+ 1 (sqr 2))) ;(sqr)
        ->(* (* 3 (+ 1 (* 2 2))) (* 3 (+ 1 (sqr 2))) ;(sqr)
        ->(* (* 3 (+ 1 4)) (* 3 (+ 1 (sqr 2))) ;(*)
        ->(* (* 3 5) (* 3 (+ 1 (sqr 2))) ;(+)
        ->(* 15 (* 3 (+ 1 (sqr 2))) ;(*)
        ->(* 15 (* 3 (+ 1 (* 2 2))) ;(sqr)
        ->(* 15 (* 3 (+ 1 4))) ;(*)
        ->(* 15 (* 3 5)) ;(+)
        ->(* 15 15) ;(*)
        ->225 ;(*)

我不知道Racket,但一般来说,如果表达式有副作用,例如修改变量、执行输入/输出等,您可能会遇到麻烦

以以下为例:

(define x 1)
(sqr (begin (set! x (add1 x)) x))
内缩径:

; x = 1
(sqr (begin (set! x (add1 x)) x))

; x = 2
(sqr (begin x))

; x = 2
(sqr (begin 2))

; x = 2
(sqr 2)

; x = 2
(* 2 2)

; x = 2
4
(my-if #t 42 (loop))
; definition of 'my-if'
(if #t 42 (loop))
; built-in 'if'
42
(my-if #t 42 (loop))
; definition of 'loop'
(my-if #t 42 (loop))
; definition of 'loop'
(my-if #t 42 (loop))
; definition of 'loop'
(my-if #t 42 (loop))
; definition of 'loop'
...
即,结果为
4
x
的最终值为
2

通过外部还原,您可以得到:

; x = 1
(* (begin (set! x (add1 x)) x)
   (begin (set! x (add1 x)) x))

; x = 2
(* (begin x)
   (begin (set! x (add1 x)) x))

; x = 2
(* 2
   (begin (set! x (add1 x)) x))

; x = 3
(* 2
   (begin x))

; x = 3
(* 2
   (begin x))

; x = 3
(* 2
   3)

; x = 3
6
即,结果为
6
x
的最终值为
3


还有一个区别。通过内部还原,可能根本不会得到结果:

(define (my-if c t e)
  (if c t e))

(define (loop)
  (loop))

(my-if #t 42 (loop))
外缩:

; x = 1
(sqr (begin (set! x (add1 x)) x))

; x = 2
(sqr (begin x))

; x = 2
(sqr (begin 2))

; x = 2
(sqr 2)

; x = 2
(* 2 2)

; x = 2
4
(my-if #t 42 (loop))
; definition of 'my-if'
(if #t 42 (loop))
; built-in 'if'
42
(my-if #t 42 (loop))
; definition of 'loop'
(my-if #t 42 (loop))
; definition of 'loop'
(my-if #t 42 (loop))
; definition of 'loop'
(my-if #t 42 (loop))
; definition of 'loop'
...
带内缩径:

; x = 1
(sqr (begin (set! x (add1 x)) x))

; x = 2
(sqr (begin x))

; x = 2
(sqr (begin 2))

; x = 2
(sqr 2)

; x = 2
(* 2 2)

; x = 2
4
(my-if #t 42 (loop))
; definition of 'my-if'
(if #t 42 (loop))
; built-in 'if'
42
(my-if #t 42 (loop))
; definition of 'loop'
(my-if #t 42 (loop))
; definition of 'loop'
(my-if #t 42 (loop))
; definition of 'loop'
(my-if #t 42 (loop))
; definition of 'loop'
...

这永远不会终止。

我不知道Racket,但一般来说,如果表达式有副作用,例如修改变量、执行输入/输出等,您可能会遇到麻烦

以以下为例:

(define x 1)
(sqr (begin (set! x (add1 x)) x))
内缩径:

; x = 1
(sqr (begin (set! x (add1 x)) x))

; x = 2
(sqr (begin x))

; x = 2
(sqr (begin 2))

; x = 2
(sqr 2)

; x = 2
(* 2 2)

; x = 2
4
(my-if #t 42 (loop))
; definition of 'my-if'
(if #t 42 (loop))
; built-in 'if'
42
(my-if #t 42 (loop))
; definition of 'loop'
(my-if #t 42 (loop))
; definition of 'loop'
(my-if #t 42 (loop))
; definition of 'loop'
(my-if #t 42 (loop))
; definition of 'loop'
...
即,结果为
4
x
的最终值为
2

通过外部还原,您可以得到:

; x = 1
(* (begin (set! x (add1 x)) x)
   (begin (set! x (add1 x)) x))

; x = 2
(* (begin x)
   (begin (set! x (add1 x)) x))

; x = 2
(* 2
   (begin (set! x (add1 x)) x))

; x = 3
(* 2
   (begin x))

; x = 3
(* 2
   (begin x))

; x = 3
(* 2
   3)

; x = 3
6
即,结果为
6
x
的最终值为
3


还有一个区别。通过内部还原,可能根本不会得到结果:

(define (my-if c t e)
  (if c t e))

(define (loop)
  (loop))

(my-if #t 42 (loop))
外缩:

; x = 1
(sqr (begin (set! x (add1 x)) x))

; x = 2
(sqr (begin x))

; x = 2
(sqr (begin 2))

; x = 2
(sqr 2)

; x = 2
(* 2 2)

; x = 2
4
(my-if #t 42 (loop))
; definition of 'my-if'
(if #t 42 (loop))
; built-in 'if'
42
(my-if #t 42 (loop))
; definition of 'loop'
(my-if #t 42 (loop))
; definition of 'loop'
(my-if #t 42 (loop))
; definition of 'loop'
(my-if #t 42 (loop))
; definition of 'loop'
...
带内缩径:

; x = 1
(sqr (begin (set! x (add1 x)) x))

; x = 2
(sqr (begin x))

; x = 2
(sqr (begin 2))

; x = 2
(sqr 2)

; x = 2
(* 2 2)

; x = 2
4
(my-if #t 42 (loop))
; definition of 'my-if'
(if #t 42 (loop))
; built-in 'if'
42
(my-if #t 42 (loop))
; definition of 'loop'
(my-if #t 42 (loop))
; definition of 'loop'
(my-if #t 42 (loop))
; definition of 'loop'
(my-if #t 42 (loop))
; definition of 'loop'
...

这永远不会终止。

@Xanlantos我的语法来源于。这不是球拍吗?@Xanlantos我添加了第二个例子,它没有使用
set
@Xanlantos我很肯定你的老师知道
设置,但它试图教您如何在没有它的情况下编程。@我的语法是从Xanlantos那里得到的。这不是球拍吗?@Xanlantos我添加了第二个例子,它没有使用
set
@Xanlantos我很肯定你的老师知道
设置,但正在尝试教您如何在没有它的情况下编程。您可以查看sicp第一章。答案是肯定的。你可以查看sicp第一章。答案是肯定的。