2012-01-11 23 views
8

tôi đang học Guile Đề án vào lúc này, và trong tài liệu tôi đột nhiên chạy vào việc xây dựng sau đây:Khi nào sử dụng định nghĩa lambda với tham số chính thức "trần"?

((lambda args (display args)) 42) 
=> (42) 

này đã ném tôi cho một vòng lặp; cho đến thời điểm này tôi đã thông số chính thức đảm nhận luôn kèm theo trong một danh sách:

((lambda (args) (display args)) 42) 
=> 42 

Tôi tự hỏi khi nào thì sử dụng biến thể này, và cách này khác với ký hiệu dấu chấm cho số biến của các đối số. Cụ thể, sự khác biệt giữa hai phiên bản sau là gì:

((lambda args (display args)) 1 2 3)  => (1 2 3) 
((lambda (. args) (display args)) 1 2 3) => (1 2 3) 

Có một sự khác biệt - có lẽ ví dụ phức tạp hơn - mà tôi cần phải nhận thức được và có lý do nào để thích một trong khác không?

+3

Như một phần thưởng, định nghĩa của 'danh sách' là '(định nghĩa danh sách (lambda xx))'. – erjiang

Trả lời

6

Sự khác biệt là phiên bản này nhận một tham số duy nhất gọi là args, hữu ích cho các trường hợp khi bạn biết chính xác số lượng các đối số thực tế dự kiến ​​cho lambda dạng:

(lambda (args) (display args)) 

Và phiên bản này nhận được (có thể trống) danh sách các thông số, được gọi là args, hữu ích khi bạn mong đợi một số biến của tham số đối với hình thức lambda:

(lambda args (display args)) 

Không nên có sự khác biệt giữa hai phiên bản tiếp theo, nhưng không phải tất cả các thông dịch viên sẽ chấp nhận cái thứ hai, vì nó thiếu phần trước dấu chấm (do đó nên tránh):

(lambda args (display args)) 
(lambda (. args) (display args)) 

Phiên bản Sau đây là hữu ích khi bạn muốn chỉ định rằng một biểu mẫu lambda có một hoặc nhiều tham số bắt buộc (biểu tượng ở bên trái dấu chấm) và danh sách các tham số tùy chọn hoặc không (một biểu tượng ở bên phải của dấu chấm):

(lambda (mandadory1 mandatory2 . optional) (display mandatory1)) 
+3

'(. Args)' không phải là cú pháp đọc hợp lệ của Lược đồ. Tuy nhiên, Guile dường như đã mở rộng đầu đọc của nó để đọc nó là 'args'. Nó chắc chắn không di động và, như bạn nói, tốt nhất nên tránh. –

+1

Tuyệt vời, cảm ơn bạn. Tôi nghĩ đó là cách khác xung quanh; giả định rằng hình thức chấm chỉ là hoàn toàn tiêu chuẩn và hình thức "trần" là một chút lẻ. Tôi đoán hình dạng chấm sau tự nhiên hơn từ các hình thức khác cho đôi mắt của người mới bắt đầu của tôi. – Janne

1

Điều này đã ném tôi cho oop; cho đến thời điểm này tôi đã thông số chính thức đảm nhận luôn kèm theo trong một danh sách:

Lưu ý rằng những thứ như (a . args)(a b . args) không thực sự liệt kê một trong hai. (a . args) là một cặp trong đó car là ký hiệu acdr là ký hiệu args. (a b . args) là một cặp trong đó car là ký hiệu acdr là (một cặp trong đó car là ký hiệu bcdr là ký hiệu args). Nó trông giống như một danh sách trong một thời gian, với ab và điều đó, nhưng vì nó không kết thúc bằng null/danh sách trống nó không thực sự là một danh sách thích hợp. Các cấu trúc như vậy thường được gọi là danh sách không đúng. Nếu bạn muốn, bạn có thể đọc một chút về các ký hiệu chấm cặp here, hoặc ở một nơi khác ...

Với (. args) tôi có lẽ muốn nói điều gì đó như "nó là một cặp nơi cdr là biểu tượng args".Hoặc có thể nó sẽ xuất hiện như "một cặp nơi carcdrargs". Dù bằng cách nào nó cũng không có ý nghĩa gì nhiều, và, như Chris Jester-Young đã nói, nó không thực sự hợp lệ.

So. Những thứ như (a b . args) chỉ là ký hiệu cặp chấm thường dùng để đặt những thứ không rỗng trong cdr cuối cùng. Nếu các tham số chính thức trong Scheme có thể là một trong những danh sách không thích hợp hoặc một danh sách thích hợp hay chỉ là một biểu tượng, thì định nghĩa của các tham số chính thức phải giống như một tham số chính thức. hoặc một cặp trong đó car là một biểu tượng và cdr là một tham số chính thức.

(Tôi nghĩ đó là một điều tuyệt vời mà làm cho một cách khá thanh lịch của các đối số liên kết với các tham số. Giống như, bạn nhìn vào các tham số chính thức, và nếu đó là một biểu tượng bạn liên kết danh sách các đối số và nếu đó là một cặp bạn liên kết các đối số car của đối số với các tham số chính thức và lặp lại trên cdr của các tham số/đối số chính thức (oh và nếu nó là null bạn đã làm hoặc cái gì đó). đánh tôi như một chút xinh đẹp hơn cách thường gặp của Lisp "và nếu biểu tượng trong car&rest bạn ràng buộc phần còn lại của các đối số cho biểu tượng sau đó".)

+0

Cặp chấm chấm - Tôi chưa bao giờ thực hiện kết nối. Nghĩ rằng đây là ký hiệu cụ thể cho đặc tả tham số chính thức. Cảm ơn; Tôi sẽ chỉnh sửa câu hỏi của mình khi có cơ hội. – Janne

Các vấn đề liên quan