2017-08-14 63 views
2

在開發BigZ時,主要用於數理論實驗,我發現在創建,過濾或轉換集合的單詞集中需要正交性。我想要一些邏輯組合的詞彙涵蓋廣泛的命令,而不需要記住大量單詞和組合它們的方法。如何在ANS-Forth中統計當地人?

1 100 condition isprime create-set 

把組上的一組堆1和100之間的所有素數,而

function 1+ transform-set 

變換該組的集合中的所有數p + 1,其中p是素數少的大於100

此外,

condition sqr filter-set 

離開組的棧上的形式的p + 1中的所有完全平方。

這對於自然數集很適合,但是能夠創建,過濾和轉換n元組集合,我需要能夠對未命名單詞中的當地人進行計數。我已經重新設計的話不久表示化合物的條件和功能:

: ~ :noname ; 
: :| postpone locals| ; immediate 

1 100 ~ :| p | p is prime p 2 + isprime p 2 - isprime or and ; 
1 100 ~ :| a b | a dup * b dup * + isprime ; 

執行此兩個例子給出了參數堆(1個100 XT),但要能處理這種權利,在第一種情況下的一組數字和在第二種情況下應該生成一組對,我將不得不補充單詞:|得到(1 100 xt n)其中n是當地人使用的麻木。我認爲可以使用> IN和PARSE來做到這一點,但很久以前我做了這樣的事情,所以我懷疑我現在可以做得很好。

回答

1

也許你應該放棄LOCALS|並自己解析局部變量。對於每一個,請使用其名稱呼叫(LOCAL),並以傳遞空字符串結束。

有關詳細信息,請參閱http://lars.nocrew.org/dpans/dpans13.htm#13.6.1.0086

+1

如果你這麼說。我不知道它是如何工作的,但會試圖找出答案。 – Lehs

+1

該文件說明(局部)在解釋和編譯模式下都是未定義的,它似乎與實現有關。 – Lehs

2

我不明白(LOCALS),但有耐心和運氣,我設法與我原來的想法去做:

: bl# \ ad n -- m 
    over + swap 0 -rot 
    do i [email protected] bl = + 
    loop negate ; 
\ count the number of blanks in the string ad n 

variable loc# 

: locals# \ -- 
    >in @ >r 
    [char] | parse bl# loc# ! 
    r> >in ! ; immediate 
\ count the number of locals while loading 

: -| \ -- 
    postpone locals# 
    postpone locals| ; immediate 
\ replace LOCALS| 

現在

: test -| a b | a b + ; 

作品LOCALS |但保留全局變量loc#中的本地人數。