2013-04-11 63 views
1

我是Scheme新手,對'define'感到好奇。我見過這樣的東西: (define (square x) (* x x)) 這是有道理的[功能名'方'輸入參數'x']。但是,我發現了一些來自90年代的示例代碼,並且試圖理解: (define (play-loop-iter strat0 strat1 count history0 history1 limit) (~Code for function~) 除了函數名稱,所有這些輸入參數?在計劃中使用'define'

+0

是的,他們是輸入參數... – piokuc 2013-04-11 21:39:10

回答

3

簡短的回答 - 是的,第一個之後的所有符號都是該過程的參數(第一個是過程名稱)。此外,它是很好的指出這一點:

(define (f x y) 
    (+ x y)) 

就是這個只是語法糖,而這兩種形式是等價的:

(define f 
    (lambda (x y) 
    (+ x y))) 

一般的 - 使用特殊形式define用於綁定的值,該值可以是任何可用的數據類型,包括特別是函數(lambdas)。

多一點有關參數和程序的定義 - 它的好,知道.符號可用於定義程序與參數的變量數,例如:

(define (f . x) ; here `x` is a list with all the parameters 
    (apply + x)) 

(f 1 2 3 4 5) ; 0 or more parameters can be passed 
=> 15 

以及一個最終招用define (在所有口譯人員中都不可用,但在Racket中工作)。一個快捷鍵定義返回程序的程序,像這樣的:

(define (f x) 
    (lambda (y) 
    (+ x y))) 

...這等同於這一點,更短的語法:

(define ((f x) y) 
    (+ x y)) 

((f 1) 2) 
=> 3 
+0

我只接受的Cuz他是第一個SEPP的答案。我真的很感激額外的信息,奧斯卡:) – V1rtua1An0ma1y 2013-04-11 22:21:37

+1

不夠公平,儘管指出[接受](http://meta.stackexchange.com/a/5235/170230)答案的標準是很好的我選擇?);) – 2013-04-11 22:23:25

+0

我也喜歡這樣做:'{define'x(* xx)}'。然後我可以這樣做:''2; => 4' :)。 – Alexey 2013-04-12 20:02:06

1

是的,strat0limitplay-loop-iter函數的參數。

0

爲定義的一般形式是:

(define (desired-name-of-procedure item-1 item-2 item-3 ... item-n) 
     (; what to do with the items)) 

另一種解釋define行爲的方式是「組合手段」和「抽象手段」。

[A]組合的用簡單的術語的手段:(和Lisp一般)

語法(item-1 item-2 item-3 ... ... item-n)是通過方案提供組合的基本手段

  • 所有碼是使用上述模式表示的列表
  • 第一個(最左邊的)項目始終視爲運算符
  • 括號強制運算符的應用程序... Th È最左邊項目需接受所有後面的項目,作爲參數

[B]抽象裝置是簡單地;一種命名事物的方式。

一個例子將展示這一切是如何摺疊成define原始的想法...


示例 - 自下而上的方式

考慮這個表達在define到達:

(lambda (x y) (* x y)) 

用普通的英語,上述表達式轉換爲「Create一個無名接受兩個參數的過程,並返回其產品的值「。請注意,這會生成一個無名稱的過程。

更準確地說,在組合手段而言,方案爲我們提供的關鍵字作爲lambda創建用戶定義的過程的原語運算符。

最左邊的item-- lambda --is通過項目(x y)(* x y)作爲參數,和運營商的應用規則的力量lambda做的項目的東西。

方式lambda被內部定義使其解析列表(x y),和治療xy作爲參數傳遞給列表(* x y),這lambda假設是做什麼用戶的定義中遇到的論點xy時。將根據規則(* x y)處理分配給xy的任何值。

輸入,手段抽象的...

假設我想指這類乘法的在幾個地方在我的計劃,我可能會調整上述lambda表達式是這樣的:

(define mul-two-things (lambda (x y) (* x y))) 

define以mul-two-things和lambda表達式作爲參數,並且「綁定」它們在一起。現在Scheme知道mul-two-things應該與一個過程相關聯,以獲取兩個參數並返回它們的產品。

碰巧,命名過程的要求非常普遍,並且提供瞭如此多的表達力量,所以Scheme提供了一個更清晰的快捷方式。

像@ oscar-lopez說的,define是「特殊形式」Scheme提供的,用來命名事物。而據方案的解釋而言,下面的兩個定義是相同的:

(define (mul-two-things x y) (* x y)) 
(define mul-two-things (lambda (x y) (* x y))