Làm thế nào để bạn phân tích
if (a > b && foo(param)) {
doSomething();
} else {
doSomethingElse();
}
Cây phân tích có thể trông giống như
if:
condition:
and:
lt:
left: a
right: b
function:
name: foo
param: param
true-block:
function:
name: doSomething
false-block:
function:
name: doSomethingElse
hmm ... hãy tuần tự hóa cây này thành một danh sách, ký hiệu tiền tố
if(and(<(a, b), function(foo, param)), function(doSomething), function(doSomethingElse))
Định dạng cây phân tích cú pháp này khá dễ thao tác, nhưng tôi có một vấn đề. Tôi ghét dải phân cách. Tôi thích những kẻ hủy diệt. Đồng thời, tôi thích rắc vào khoảng trắng.
if( and (<(a b) function(foo param)) function (doSomething) function ( doSomethingElse))
hmm ... khoảng trắng bổ sung làm cho một số thứ khó phân tích hơn ... Có lẽ tôi chỉ có thể đưa ra một quy tắc rằng cây được biểu thị là (lá lá rễ).
(if (and (< a b) (function foo param)) (function doSomething) (function doSomethineElse)
Bây giờ việc tuần tự hóa một cây phân tích của tôi là không thể (đổi tên hàm để áp dụng, và điều này có thể chạy). Nếu tôi muốn các chương trình viết chương trình, thật tuyệt khi chỉ thao tác với các cây phân tích cú pháp.
Đây không hoàn toàn là cách biểu thức s xuất hiện, nhưng nó đã được xác định sớm và đó là một tính năng mà các lập trình viên không thể sử dụng. Các chương trình của chúng tôi được phân tích trước theo một số nghĩa và việc viết chương trình để thao tác các chương trình khá dễ dàng vì định dạng. Đó là lý do tại sao việc thiếu cú pháp đôi khi được coi là một thế mạnh.
Nhưng như David nói, hãy sử dụng một trình soạn thảo nhận biết biểu thức s. Bạn có nhiều khả năng mất dấu vết của dấu ngoặc nhọn trong biểu thức s hơn là dấu ngoặc đóng trong xml ( </foo>
chỉ đóng <foo>
, nhưng paren phải đóng biểu thức BẤT K)). Trong vợt, việc sử dụng dấu ngoặc vuông cho một số biểu thức, kết hợp với kiểu thụt lề tốt, khắc phục hầu hết các vấn đề.
Phiên bản lisp:
(if (and (< a b) (foo param))
(doSomething)
(doSomethingElse))
Không tệ lắm.