Для обработки частей вашего кода s"
оставляет addr u
в стеке, адрес и длину строки. ,
сохраняет только одно значение, поэтому вы не получите желаемых результатов. 2,
может сделать это, поскольку это сохранит оба элемента стека, которые представляют строку. Как только вы это сделали, вам нужно вернуть оба значения, так что [email protected]
- это то, что вы хотите.
Мое переписывание будет выглядеть следующим образом:
create myarray s" Alpha" 2, s" Beta" 2, s" Charlie" 2,
\ Test
myarray [email protected] type Alpha **ok**
Как и на других элементах вашего массива немного сложнее. Когда вы вводите myarray
, вы получаете адрес начала данных в этой записи словаря, и затем вы можете использовать 2 @, чтобы получить то, на что указывают первые два адреса (которые являются адресом и длиной «Альфа») , Если вы хотите «Beta вам нужно следующую пару адресов. Таким образом, вы можете использовать
myarray 2 cells + \ increment the address by two cells
Чтобы получить адреса, которые указывают на„бета“и так далее. Таким образом, для того, чтобы получить доступ к„Beta“вы должны ввести
myarray 2 cells + [email protected] type Beta **ok**
Я испытал это с gforth и, кажется, все работы, хотя я не знаю, как тщательно проверить настойчивостью.
Ваше слово должны были бы быть в состоянии сделать адрес Инкрементирование на основании каких находится в стеке, чтобы начать с него. Возможно, вы захотите влезть в еще create does>
вещи. Я могу дать несколько указателей, но я не хочу испортить удовольствие от открытия.
Если я пропускаю слишком много деталей о том, что это на самом деле означает просто сказать, и я попробую еще раз.
Возможно, это слишком грубо, но я давно решил сделать «тип струны».
: string (addr u "name" --)
create 2, \ add address and length to dict entry "name"
does> dup cell+ @ swap @ ; \ push addr u
\ Example
s" Some Words" string words **ok**
word type Some Words **ok**
Он определяет слово с именем вашего выбора (в данном случае «слов»), который будет толкать длину и начальный адрес вашей строки (в данном случае «некоторые слова»), когда она интерпретируется. Насколько я знаю, когда строка находится в таком определении, она устойчива.
Это не полностью отвечает на ваш вопрос, но может помочь.
я был еще один пойти на постоянной строке, это одно определенно allot
сек памяти внутри словарной статьи и будет в безопасности, пока это слово не существует. До того, как строка «type» сохранит только адрес и длину, созданные s"
, которые являются хорошими только до тех пор, пока над этим регионом памяти не будет написано что-то другое. Теперь он копирует строку, из которой s"
создает ее в словаре, называемом «имя», где он, как ожидается, будет продолжаться до тех пор, пока «имя» будет само.
: string (addr u "name" --)
create \ create dict entry called "name"
dup >r here >r \ keep copies of string length and start of "name"'s memory
dup 2 cells + allot \ allot memory for the number of chars/bytes of the string plus 2
\ for the new addr u
[email protected] 2 cells + \ Get the address two cells from the start the space for "name"
swap cmove \ copy the string at addr u into the alloted space for "name"
\ Now "name" looks like this: "name" -blank1- -blank2- "the text of the string at addr u"
\ blank1 should be the address of the start of the the text = addr2 and blank2 should be u
[email protected] dup 2 cells + swap ! \ get the address of blank1, copy it, increment by 2 to get addr2
\ and then store that in blank1
r> cell+ r> swap ! \ get address of blank1, increment to get address of blank2, then get u and
\ store it in blank2
\ Now "name" looks like this: "name" addr2 u "the text of the string at addr u"
does> dup @ swap cell+ @ ; \ push addr2 u
Для развлечения, я думал, что я мог бы показать, как мало смысла это делает без полезной форматирования
: string-no-comments (addr u "name" --)
create dup >r here >r dup 2 cells + allot [email protected]
2 cells + swap cmove [email protected] dup 2 cells + swap !
r> cell+ r> swap ! does> dup @ swap cell+ @ ;
На самом деле, я не могу следовать до того момента, когда вы прокомментируете «' создают делает> ' вещи». Мне нужно будет копать глубже, чтобы понять все остальное. Кроме того, я думаю, что вы решили мою проблему (с возможной открытой проблемой упорства, которая явно плохо документирована в руководстве GForth). Спасибо! – user8472
Да, это было довольно расплывчато, в основном я не был уверен, как это сделать, не задумываясь об этом некоторое время. Кажется, что все, что содержится в определении, является постоянным (это то, что я взял из руководства). – sheepez
@ user8472 Я просто хотел предупредить вас о моих изменениях, новая версия определенно настойчива. – sheepez