Chúng không giống nhau! Tên của họ thực sự có thể giúp bạn nhớ cái nào.
map
sẽ lấy làm đối số một quy trình và một hoặc nhiều danh sách. Thủ tục sẽ được gọi một lần cho mỗi vị trí của danh sách, sử dụng như các đối số danh sách các yếu tố tại vị trí đó:
(map - '(2 3 4))
; => (-2 -3 -4)
map
gọi (- 2)
, (- 3)
, (- 4)
để xây dựng danh sách.
(map + '(1 2 3)
'(10 20 30))
; => (11 22 33)
map
gọi (+ 1 10)
(+ 2 20)
(+ 3 30)
để xây dựng danh sách.
(map * '(2 2 -1)
'(0 3 4)
'(5 4 2))
; => (0 24 -8)
map
gọi (* 2 0 5)
(* 2 3 4)
(* -1 4 2)
để xây dựng danh sách.
map
có tên đó vì nó thực hiện một "bản đồ" (chức năng) trên một tập hợp các giá trị (trong danh sách):
(map - '(2 3 4))
arguments mapping "-" result
2 === (- 2) ===> -2
3 === (- 3) ===> -3
4 === (- 4) ===> -4
(map + '(1 2 3)
'(10 20 30))
arguments mapping "+" result
1 10 === (+ 1 10) ===> 11
2 20 === (+ 2 20) ===> 22
3 30 === (+ 3 30) ===> 33
apply
sẽ mất ít nhất hai lập luận, là người đầu tiên trong số họ là một thủ tục và danh sách cuối cùng.Nó sẽ gọi thủ tục với các đối số sau đây, kể cả những người trong danh sách:
(apply + '(2 3 4))
; => 9
Đây là giống như (+ 2 3 4)
(apply display '("Hello, world!"))
; does not return a value, but prints "Hello, world!"
Đây là giống như (display "Hello, world!")
.
apply
rất hữu ích khi bạn có lý lẽ như một danh sách,
(define arguments '(10 50 100))
(apply + arguments)
Nếu bạn cố gắng viết lại dòng cuối cùng mà không sử dụng apply
, bạn sẽ nhận ra rằng bạn cần để lặp qua danh sách tổng hợp mỗi phần tử. ..
apply
cũng có thể được sử dụng với nhiều hơn hai đối số đó. Đối số đầu tiên phải là một đối tượng có thể gọi (một thủ tục hoặc một sự tiếp tục). Người cuối cùng phải là một danh sách. Những người khác (giữa người đầu tiên và người cuối cùng) là các đối tượng thuộc bất kỳ loại nào. Vì vậy, gọi
(apply PROC a b c ... y z '(one two ... twenty))
được giống như gọi
(PROC a b c ... y z one two ... twenty)
Dưới đây là một ví dụ cụ thể:
(apply + 1 -2 3 '(10 20))
; => 32
Đây là giống như (+ 1 -2 3 10 20)
apply
đã biết tên vì nó cho phép bạn "áp dụng" một thủ tục cho một số đối số.
Trong Đề án 'áp dụng' nhận bất kỳ số lượng đối số nào, nhưng yêu cầu đầu tiên phải là một cái gì đó có thể gọi (thủ tục hoặc tiếp tục) và cuối cùng phải là một danh sách. Các đối số ở giữa là các đối số đầu tiên .. '(áp dụng danh sách bản đồ '((abc) (1 2 3))) => ((a 1) (b 2) (c 3))' – Sylwester
@Sylwester: vâng, Tôi đã chỉnh sửa bài đăng. Cảm ơn! – Jay
Sự khác biệt quan trọng khác là bản đồ luôn trả về một danh sách. –