2013-02-16 33 views
8

Tôi muốn triển khai các từ Forth VALUETO trên RPC/8 (máy tính được mô phỏng trong Minecraftmod). Nỗ lực tốt nhất của tôi khiến tôi trở thành một tập hợp các từ hoạt động tốt, miễn là tôi không sử dụng chúng trong khi biên dịch. Nhiều công cụ khác nhau là VALUE, nhưng TO thì không.Cách xác định VALUE và TO

: VALUE CREATE , DOES> @ ; 
: TO ' 3 + ! ; 

Tôi đã thử tất cả mọi thứ tôi có thể nghĩ ra để làm cho nó làm việc và nỗ lực hết sức mình được tôi này:

['] NameOfAValue + 3 ! 

Lưu ý rằng bộ vi xử lý không phải là một tinh khiết 6502 nhưng một 65EL02, một biến thể tùy chỉnh của số 65816.

EDIT # 1: Bằng cách nào đó tôi đã quên cuộc gọi để TẠO trong giá trị. Nó nên có được tất cả cùng. EDIT # 2: Tôi cũng nhận được 3+ chuyển sang TO ... oops. Nó phải là cách khác tất cả cùng.

+8

Ồ. Một câu hỏi về FORTH chạy trên một kiến ​​trúc máy tính mô phỏng trên đầu trang của một biến thể mô phỏng của một biến thể của một 6502 bên trong một trò chơi. Tôi không thể trả lời nó, nhưng chỉ +1 cho meta-meta-ness của nó! –

+0

@Jonners Minecraft (dành cho PC) được viết bằng Java nên tất cả đều đang chạy trên máy ảo. – sheepez

+0

@Milo; Mã được liệt kê ở đây cho TO vẫn sai Milo. ! là (a n -) không (n a -). TO đang cố gắng lưu trữ một ngăn xếp ngăn xếp đến địa chỉ 3. Nó cần phải là ': TO (n) '3 +!' –

Trả lời

2

Ok Sau rất nhiều thử nghiệm và lỗi cũng như tìm kiếm nhiều, tôi tìm thấy một cái gì đó mà nên làm việc, nhưng vì hai lỗi trong redFORTH, không.

GIÁ TRỊ

\ Works fine, now to reset the value. 
: VALUE \ n <name> -- 
    CREATE , 
    DOES> @ 
; 

ĐẾN

\ Works if not compiling, LITERAL and POSTPONE are broken. 
: TO 
    TIBWORD FIND 3 + 
    STATE @ IF 
     POSTPONE LITERAL 
     POSTPONE ! 
    ELSE 
     ! 
    THEN 
; IMMEDIATE 

Demo của lỗi trong Literal

\ fails, very wierd error. 
: TESTLIT [ 42 ] LITERAL ; 
\ TESTLIT Unknown Token: TESTLIT 
\ FORGET TESTLIT Unknown Token: TESTLIT 
\ WORDS TESTLIT COLD SORTMATCH ... 

Demo của lỗi trong hoãn

\ fails, postpone is directly equivelent to ['] 
: TESTPOST POSTPONE + ; IMMEDIATE 
: TEST 2 2 TESTPOST . ; 
\ . 1935 
\ ' + . 1935 

Tôi tắt để gửi báo cáo lỗi ....

EDIT # 1: Sau một số thử nghiệm và lỗi khác chứ không phải một chút chửi thề (Tôi không tốt với FORTH) Tôi đã tìm cách để làm cho nó công việc.

: TO 
    TIBWORD FIND 3 + 
    STATE @ IF 
     (lit) (lit) , , \ store address 
     (lit) ! , 
ELSE 
     ! 
    THEN 
; IMMEDIATE 
+0

Đã thêm giải pháp cho câu trả lời. –

0

Tôi không chắc Forth xử lý thời gian diễn giải như thế nào so với thời gian biên dịch, nhưng định nghĩa TO đang cố gắng lưu trữ giá trị để giải quyết 3. Có vẻ cá.

+0

3 là giá trị bù trừ từ xt khi giá trị được tạo bởi CREATE là. Tôi thấy điều này qua trải nghiệm, quá xấu không có từ nào được xác định để có được bù đắp này theo cách di động (trong redFORTH, có các số khác) –

+0

Milo, xin lỗi, nhưng thứ tự từ sai. Hãy thử 'từ 3 +! –

+0

Xin lỗi bài đăng kép, mất hơn 5 phút để tìm mẹo định dạng mã cho nhận xét. Backtick, tôi đoán vậy.Lời bình luận ở trên nên đọc ... Milo, xin lỗi, nhưng thứ tự từ trông có vẻ sai. Hãy thử ''từ 3 +!' Những gì tôi thấy trong định nghĩa TO của bạn là; đánh dấu một từ, thêm bất kỳ thứ gì khác vào ngăn xếp tại thời điểm đó, lưu giá trị đó vào địa chỉ 3. –

0

Giải pháp đơn giản nhất là

VARIABLE TO-MESSAGE \ 0 : FROM , 1 : TO .   
: TO 1 TO-MESSAGE ! ; 

: VALUE CREATE , DOES> TO-MESSAGE @ IF ! ELSE @ THEN 
0 TO_MESSAGE ! ;