Câu trả lời:
Forth có hai cấu trúc lặp, x y do
... loop
, và ít được biết đến hơn [begin]
... [until] x y
ở đâu x
và y
là các giá trị cho giới hạn và chỉ mục, hoặc các điều kiện cần lưu ý, tương ứng.
Đây là rất chậm, rất nhiều từ (haha) và nói chung khá bloaty, vì vậy chỉ sử dụng chúng nếu bạn cần.
Thay vào đó, giống như một ngôn ngữ chức năng phù hợp (thực sự là Forth), người ta nên thích đệ quy hơn các vòng lặp rõ ràng vì nó có xu hướng ngắn hơn và sử dụng ngôn ngữ tốt hơn.
Các chương trình không bắt buộc phải an toàn.
Thay vào đó, họ có thể để lại thêm rác trên ngăn xếp nếu nó giúp bạn tiết kiệm byte. Trong Forth, "giá trị trả về" đang để lại thứ gì đó trên đầu ngăn xếp. Có thể không có vấn đề gì bạn có rác bên dưới ngăn xếp đó trừ khi bạn sử dụng đệ quy và độ sâu ngăn xếp.
Forth có rất nhiều từ dựng sẵn thú vị, nhiều từ này hữu ích cho việc tạo ra các loại thuật toán được tìm thấy trên PPCG.
Một ví dụ xấu nhưng minh họa cho điều này là các từ để tăng ( 1+
) và giảm ( 1-
). Họ lưu một byte qua việc viết 1 +
để tăng đỉnh của ngăn xếp.
Ngoài ra, đây là một danh sách tiện dụng gồm nhiều từ (có thể không phải tất cả) được tìm thấy trong các bản phân phối hiện đại như thế nào gforth
.
Khi viết mã của bạn, hãy chú ý đến những gì xảy ra trên ngăn xếp ở mỗi lệnh. Tôi thường vẽ nó ra khi tôi đi, như vậy:
6 6
7 7 6
* DUP 42 42
Khi bạn đi như thế này, bạn có thể tìm thấy nó dễ dàng hơn để nhận biết khi bạn có thể tận dụng ngăn xếp hoạt động như ROT
, -ROT
, 2DUP
, 2OVER
, vv ...
Điều này bao gồm số học hai ô , bitwise , so sánh số và các từ thao tác ngăn xếp . Số nguyên tế bào kép cũng tính.
1.
) cho một chữ hai ô. Đối với các số nhỏ, điều đó có nghĩa là đẩy thêm một số 0 với chi phí chỉ bằng một byte.m+
= 0 d+
~ = under+
(không chính xác, vì có thể xảy ra tràn.)d2*
và d2/
có thể được sử dụng để trích xuất / đẩy một bit từ một từ.a b c d d=
= = a c = b d = and
a b c d d<>
= = a c <> b d <> or
2dup
, 2over
, 2tuck
có một cơ hội tốt để giành chiến thắng qua các biến địa phương.gforth có một ngăn xếp riêng cho các số dấu phẩy động. Ngay cả khi bạn chỉ xử lý các số nguyên, việc giảm tải một số công việc và lưu trữ vào ngăn xếp FP có thể dẫn đến tổng thể mã ngắn hơn, bằng cách tránh thao tác ngăn xếp rõ ràng hoặc sử dụng các hoạt động cụ thể của FP không có sẵn trên ngăn xếp chính. Quay trở lại ngăn xếp FP cũng là một tùy chọn hoàn toàn hợp lệ (trừ khi nhiệm vụ là trả về boolean).
f
tiền tố, như trong f+
, fdup
v.v.). Số chữ FP cũng tốn thêm một byte (postfix e
, như trong 1e
), nhưng một số số có thể buộc hoặc thậm chí lưu một byte (ví dụ 1e3
thay vì 1000
).1+
và 1-
.f**
(sức mạnh), falog
(sức mạnh của 10) fsqrt
và các hoạt động khác nhau, log, lượng giác liên quan đến lượng giác.s>f
(đơn sang phao), f>s
(nổi sang đơn), d>f
(gấp đôi để nổi), f>d
(thả nổi thành gấp đôi). Đôi khi, các biến thể "nhân đôi" có thể được sử dụng để sản xuất hoặc tiêu thụ thêm một số không.