2013-07-29 17 views
5

Đối với đoạn mã sau:Làm thế nào để chuyển `và` thành một hàm trong Racket?

(foldl and #t '(#t #f)) 

vợt trả:

and: bad syntax in: and 

Tôi biết and không phải là một hàm. Và tôi có thể phá vỡ vấn đề này bằng lambda:

(foldl (lambda (a b) (and a b)) #t '(#t #f)) 

Tôi có 2 câu hỏi ở đây:

  1. and không phải là một hàm. Thế nó là gì? Nó là một vĩ mô?

  2. Giải pháp của tôi sử dụng lambda có vẻ xấu. Có cách nào tốt hơn để giải quyết vấn đề này không?

Cảm ơn bạn.

+0

Bạn luôn có thể tô điểm nó với srfi-26 (cắt) – jozefg

+1

@jozefg bạn có nghĩa là '(foldl (cắt và <><>) #t '(#t #F)) '? Nhưng [SRFI-26] (http://docs.racket-lang.org/srfi-std/srfi-26.html?q=cut#cut) cũng nói rằng '(cắt nếu <> 0 1)' là bất hợp pháp bởi vì 'if' không phải là" một biểu thức trong ý nghĩa của R5RS "- mà dường như làm cho' và' bất hợp pháp cũng ở đó. –

+0

@WillNess Nó kiểm tra tốt cho tôi với vợt 5.3. Cho dù điều này có thực hiện cụ thể hay không, tôi không chắc chắn – jozefg

Trả lời

7

Đây là conditionalsyntactic form hoặc có thể được triển khai dưới dạng macro mở rộng đến một số core syntax form, được trình biên dịch/thông dịch coi là trường hợp đặc biệt.

The list there in Racket's docs bao gồm if dưới dạng biểu mẫu đặc biệt nhưng không bao gồm and, vì vậy có thể được thực hiện dưới dạng cũ nhất. Nhưng R5RS does list and as a syntactic keyword. Vì vậy, tốt nhất chúng ta có thể nói, đó là một cú pháp đặc biệt hoặc macro.

Thật dễ dàng để viết lại bất kỳ biểu mẫu and(and a b c ...) dưới dạng một mẫu if, (if a (if b (if C#t #f) #f) #f).

lambda là tốt bởi tôi, nhưng bạn cũng có thể sử dụng every from SRFI-1 (hoặc Racket's andmap):

(every identity '(#t #f)) 

should return #f.

chỉnh sửa: ngoại trừ, as Joshua Taylor points out, gọi lambda thông qua chức năng như foldl không ngắn mạch. Mà đánh bại mục đích để gọi and ở nơi đầu tiên.

Một điều khác là, trong Racket's foldl đối số cuối cùng đối với lambda là đối số nhận kết quả trước đó trong chuỗi ứng dụng; vì thế việc thực hiện thực sự nên

(foldl (lambda (a b) (and b a)) #t '(#t #f)) 
Các vấn đề liên quan