2012-09-22 38 views
6

Tại sao Forth sử dụng câu lệnh IF THEN ... thay vì ENDIF?Tại sao Forth sử dụng câu lệnh IF THEN ... thay vì ENDIF?

Tôi đang triển khai một trình biên dịch Forth (không phù hợp). Về cơ bản, cú pháp của Forth xuất hiện rất trực quan đối với tôi về các câu lệnh IF.

IF ."Statement is true" 
ELSE ."Statement is not true" 
THEN ."Printed no matter what; 

Tại sao câu lệnh kết thúc là THEN? Điều này làm cho ngôn ngữ đọc cực kỳ kỳ lạ đối với tôi. Đối với trình biên dịch của tôi, tôi đang xem xét thay đổi nó thành một cái gì đó như ENDIF mà đọc tự nhiên hơn. Nhưng, lý do đằng sau những câu lệnh IF-THEN ngược lại ở nơi đầu tiên là gì?

+0

Có ai nghĩ điều này phù hợp hơn với người lập trình không? – Earlz

+1

Bạn sẽ phải hỏi Chuck Moore. Không ai khác sẽ biết câu trả lời. [Ở đây anh ta nói khi anh ta giới thiệu "postfix đôi khi bị chỉ trích có điều kiện"] (http://www.colorforth.com/HOPL.html). –

+0

Nếu tôi không nhầm lẫn nhiều, có (hoặc, có lẽ, là) triển khai (không thể nhớ được tại thời điểm này, xin lỗi) trong đó ENDIF được định nghĩa là một loại từ đồng nghĩa của THEN, có nghĩa là bạn không phải là người đầu tiên để tìm chuỗi 'IF-ELSE-THEN' hơi khác thường. Tôi, tôi chưa bao giờ gặp vấn đề với nó. (Tôi nghĩ rằng tôi đã nhìn thấy một lời giải thích cho nó trong một số cuốn sách từ lâu, và nó đã được theo dòng @AshleyF đã nói trong câu trả lời của mình.) –

Trả lời

6

Chỉ cần nghĩ về nó như "IF đó là trường hợp, làm được điều này, ELSE làm điều đó ... và THEN tiếp tục với ..."

Hoặc tốt hơn, trích dẫn sử dụng (như trong Factor, RetroForth, ...) trong trường hợp đó là hoàn toàn postfix mà không có các từ biên dịch đặc biệt; chỉ các từ thông thường lấy địa chỉ từ ngăn xếp: [ do this ] [ do that ] if hoặc [ do this ] when hoặc [ do that ] unless. Cá nhân tôi rất thích điều này.

Ngoài RE: danh ngôn

Đây là how quotations are compiled in RetroForth. Trong Forth của riêng tôi (mà biên dịch cho máy ảo của riêng tôi), tôi chỉ cần thêm một lệnh QUOTE đẩy địa chỉ tiếp theo vào ngăn xếp và nhảy qua n-byte. Các n-byte được mong đợi sẽ bị chấm dứt bởi lệnh RETURN và các từ if, when, unless tiêu thụ vị từ cùng với địa chỉ được để lại bởi các trích dẫn trước; gọi điện thoại thích hợp. Rất đơn giản, và các trích dẫn thường mở cửa cho all kinds of beautiful abstractions away from thinking about the stack.

+0

Tôi chưa bao giờ nghe nói về trích dẫn! Điều đó trông giống như một cơ chế trừu tượng tuyệt vời mặc dù. Khi tôi lần đầu tiên đề cập đến dự án này, tôi đã tự hỏi liệu có thể có chức năng ẩn danh trong Forth – Earlz

+1

Điều này có thể áp dụng được hay không, nhưng phần 1 của "Niềm vui của ngôn ngữ ghép nối" ([Phần 1] (http://www.codecommit.com/blog/cat/the-joy-of-concatenative-languages-part-1), [Phần 2] (http://www.codecommit.com/blog/cat/the- joy-of-concatenative-languages-part-2), [Phần 3] (http://www.codecommit.com/blog/cat/the-joy-of-concatenative-languages-part-3)) nêu rõ: " Các điều kiện cũng trông khá kỳ lạ ngay từ cái nhìn đầu tiên, nhưng dưới bề mặt chúng hoàn toàn thanh lịch ... " –

+0

Tôi có một vấn đề với nó sau khi suy nghĩ kỹ hơn một chút. Làm thế nào bạn sẽ thực hiện một cái gì đó như '1 [10] [20] nếu .' Đầu ra dự kiến ​​sẽ là' 10' .. Nhưng, nó được ngăn xếp ra khỏi dòng và khi báo giá "trả về", nó trở về hoặc '10 'hoặc' 20' không đúng. Hoặc điều này chỉ nên được thực hiện với ngăn xếp cuộc gọi "ẩn" phụ cho các lợi nhuận nội bộ như vậy? – Earlz

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