2010-08-05 42 views
1

在方案中,爲什麼是這樣的:爲什麼lambda而不是函數定義速記在方案中被認爲是很好的風格?

(define foo 
    (lambda (x) 
    42)) 

認爲是更好的風格莫過於:

(define (foo x) 
    42) 

而且沒有任何理由贊成一個比其他?

+3

根據什麼樣式指導? – 2010-08-05 20:44:40

+0

你從哪裏閱讀過那種風格1?我從來沒有見過這樣的事情。 Lambda用於匿名函數,延續傳遞,映射和返回閉包。它對很多事情都很有用,但我更喜歡使用'(define(fun x y)...)'的緊湊性。 – 2010-08-09 12:50:13

+1

個人喜好。 – grettke 2010-08-20 17:04:14

回答

4

我不認爲這被認爲是更好的風格,第一個是多餘的。真正的問題是您是定義命名函數foo還是僅使用lambda。如果你已經決定做一個命名函數foo那麼我不明白你爲什麼會把lambda放在裏面。 lambda讓您不必單獨命名和定義您製作的每個小函數,因此這真的是決定的地方:這個函數是否足夠重要,可以單獨定義和命名。

0

你展示什麼是相當於這個在Javascript:

var foo = function(x) {42;} 

VS

function foo(x) { 
    42; 
} 

後者是前者的語法糖。第一種風格是通用形式,後者是定義函數的捷徑。

至於風格,我不知道爲什麼前者是首選。它更長,需要更多的嵌套。

0

如果風格是偏好的另一個詞,那麼我同意前者是一個更好的風格。它直截了當地說,「foo是x的函數」。很難在那裏出錯。第二個例子中的「defun」風格的論點是,您將其定義爲您稱之爲的方式。

在C語言中聲明一個指針變量的時候,它就是lisp的等價物。沒有意義:選擇你喜歡的或者你正在使用的組已經決定的東西。沒有人會誤解你。

0

這是因爲

(define (foo x) 
    42) 

添加一種特殊形式的語言。

1.

(define foo 45) 

是一個特殊形式

2.

(lambda (x) (+ x 1) 

是一種其他特殊形式如此:

(define foo (lambda (x) (+ x 1))) 

添加沒有其他特殊形式大於上面的2。

因此,添加定義函數的簡寫是一個語法糖。由於計劃傾向於極簡主義,因此語言無需添加比必要的更多特殊形式。現在我認爲:

(define foo (x) (+ x 1)) 

是可讀的,它不會花費重新記憶和理解,所以我不介意在方案中有它。

相關問題