2012-07-27 22 views
6

nếu tôi có một cái gì đó như thế này (define s (hi,there)) thì làm sao tôi có thể viết trong trận đấu như (match s [(,h , ,t)] ...) Nhưng nó không làm việc, bởi vì match cần , vậy làm thế nào tôi có thể làm điều này?Làm thế nào để phù hợp, trong trận đấu trong Racket?

+0

Hãy tha thứ cho những nhận xét không mong muốn, nhưng nó xuất hiện với tôi rằng bằng cách sử dụng vợt 'phù hợp' để phân tích cú pháp đầu vào có chứa dấu phẩy có lẽ không phải là một ý tưởng tuyệt vời; trừ khi phần còn lại của đầu vào thực sự rất gần với vợt/LISP, điều này nghe có vẻ giống như một trường hợp để cắn viên đạn và sử dụng một trình phân tích cú pháp thực tế. Xin lỗi trước nếu tôi đã hiểu lầm trường hợp sử dụng của bạn. –

+0

@JohnClements Tôi nghĩ bạn đúng .. và câu chuyện là chương trình chính của tôi được viết bằng Racket và tôi chỉ muốn lấy các cấu trúc dữ liệu được xây dựng từ phân tích cú pháp tệp trong Racket. Các tập tin gần như trông giống như S-Exp, sau đó cho đến khi rất muộn, tôi thấy có dấu phẩy ... –

+0

Bạn có bất kỳ loại đặc điểm kỹ thuật cho những gì các hình thức có thể xảy ra trong tập tin nguồn? Tệp nguồn có được viết bằng một số ngôn ngữ nổi tiếng không? –

Trả lời

7

Lưu ý đầu tiên rằng dấu phẩy , là từ viết tắt của trình đọc đặc biệt. (hi,there) được đọc là (hi (unquote there)). Đây là khó phát hiện - vì danh sách in máy in mặc định là có phần tử đầu tiên là unquote theo cách đặc biệt.

Welcome to DrRacket, version 5.3.0.14--2012-07-24(f8f24ff2/d) [3m]. 
Language: racket. 
> (list 'hi (list 'unquote 'there)) 
'(hi ,there) 

Vì vậy, mẫu bạn cần là '(danh sách h (danh sách' unquote t)) '.

> (define s '(hi,there)) 
> (match s [(list h (list 'unquote t)) (list h t)]) 
(list 'hi 'there) 
2

Sử dụng một dấu chéo ngược nếu bạn muốn sử dụng dấu phẩy như một biểu tượng bên trong của một phần trích dẫn:

> (define s '(hi \, there)) 
> (match s [(list h c t) (symbol->string c)]) 
"," 

Và sử dụng '|,| cho biểu tượng dấu phẩy độc lập.

> (match s [(list h '|,| t) (list h t)]) 
'(hi there) 

Trong cả hai trường hợp, bạn thực sự nên sử dụng khoảng trắng để phân tách mọi thứ và sử dụng danh sách.

(define s (hi,there)) không phải là Racket hợp lệ.

+0

Lý do có dấu phẩy bên trong là tệp tôi đang phân tích cú pháp sử dụng nó để phân tách nhiều thứ và tôi muốn sử dụng đối sánh Racket để phân tích tệp (thực sự quan tâm hơn khi tôi tìm thấy dấu phẩy là rất đặc biệt trong vợt!) Nhưng cảm ơn cho câu trả lời từ các bạn) –

1

Tôi nghĩ bạn có thể nhầm lẫn về nơi bạn cần dấu phẩy. Trong Racket, bạn không sử dụng dấu phẩy để phân tách các phần tử trong một danh sách. Thay vào đó, bạn chỉ cần sử dụng khoảng trắng. Hãy cho tôi biết nếu điều này là sai, nhưng những gì tôi tưởng tượng là bạn đang cố gắng để phù hợp với một biểu thức như (define s '(hi there)). Để làm điều đó, bạn sẽ sử dụng

(match s 
    [`(,h ,t) ...]) 

Sau đó, trong khu vực nơi elipses là, biến h có giá trị 'hi, và biến t có giá trị 'there

+0

Tôi chỉ muốn tận dụng lợi thế của 'match' trong Racket để phân tích định dạng s-biểu hiện giống như VỚI COMMA bên trong dấu ngoặc đơn. –

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