我是Scheme新手,對'define'感到好奇。我見過這樣的東西: (define (square x) (* x x))
這是有道理的[功能名'方'輸入參數'x']。但是,我發現了一些來自90年代的示例代碼,並且試圖理解: (define (play-loop-iter strat0 strat1 count history0 history1 limit) (~Code for function~)
除了函數名稱,所有這些輸入參數?在計劃中使用'define'
回答
簡短的回答 - 是的,第一個之後的所有符號都是該過程的參數(第一個是過程名稱)。此外,它是很好的指出這一點:
(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
我只接受的Cuz他是第一個SEPP的答案。我真的很感激額外的信息,奧斯卡:) – V1rtua1An0ma1y 2013-04-11 22:21:37
不夠公平,儘管指出[接受](http://meta.stackexchange.com/a/5235/170230)答案的標準是很好的我選擇?);) – 2013-04-11 22:23:25
我也喜歡這樣做:'{define'x(* xx)}'。然後我可以這樣做:''2; => 4' :)。 – Alexey 2013-04-12 20:02:06
是的,strat0
到limit
是play-loop-iter
函數的參數。
爲定義的一般形式是:
(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)
,和治療x
和y
作爲參數傳遞給列表(* x y)
,這lambda
假設是做什麼用戶的定義中遇到的論點x
和y
時。將根據規則(* x y)
處理分配給x
和y
的任何值。
輸入,手段抽象的...
假設我想指這類乘法的在幾個地方在我的計劃,我可能會調整上述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))
- 1. 在計劃中使用「和」
- 2. 便攜式加載/在R5RS計劃中包含define-syntax?
- 3. GCC在#define中需要下劃線?
- 4. 在函數中使用#define
- 5. 在printf中使用#define?
- 6. 在方程中使用#define
- 7. 計劃使用DBMS_JOB
- 8. 在小計劃腳本中空使用
- 9. 在C++中使用C頭計劃
- 10. 在計劃中使用追加
- 11. 在Excel中使用VBA制定計劃
- 12. 如何在計劃中使用foldr?
- 13. 在LOOP中使用「at」CMD的計劃
- 14. 在本地計劃中使用
- 15. 在chez計劃中使用匹配
- 16. 如何在計劃中使用「cond」?
- 17. 計劃在C++中
- 18. 計劃在Java中
- 19. 使用Jenkins計劃Excel宏
- 20. 使用DDD建模計劃
- 21. 使用Javascript:保險計劃
- 22. 使用Quartz計劃作業
- 23. 計劃使用PowerShell 3.0
- 24. Selenium webdriver使用計劃?
- 25. 重複使用FFTW3計劃
- 26. 使用計劃任務
- 27. 計劃使用eclipse IDE
- 28. 計劃 - 使用延續
- 29. 如何在宏中使用if(define)?
- 30. #define在java中使用/ android studio
是的,他們是輸入參數... – piokuc 2013-04-11 21:39:10