Таймерные задачи в JBForth: TIMER-START

 
+
-
edit
 

Balancer

администратор
★★★★★
Перенос с концепция легкого боевого самолета для борьбы с мелкими дтг [U235#27.03.02 06:22]
awarm:
ладно. можно сказать с цикломи разобрался.
теперь такой вопрос. мне надо вызвать по таймеру функцию с параметром.
я могу сделать
"1 ex" 3000 timer-start
а вот как мне "1 ex" получит из 1 и "ex" ??
 


Гм. Да так и должно передаться. Таймер, срабатывая, вызывает не одно слово, а весь переданный ему код.
 

awarm

разработчик l2j-сервера

нет. ты не понял.
Собственно это вопрос не вызова таймера, а работы с типами данных.
т.е. мне надо сложить целочисленную переменную и строку.
ладно. если ты занят, отпишись, я сам сделаю преобразование типов.
 
+
-
edit
 

Balancer

администратор
★★★★★
Да, преобразования типов давно полезно сделать :D

А так - строкове сложение - это S+
Оно с преобразованием должно работать.

См. Strings.java

...

А я сейчас вожусь с полноценной реализацией словарей.
 
+
-
edit
 

Balancer

администратор
★★★★★
code forth
  1. : test-ex
  2.    "ex" S+ 3000 timer-start
  3. ;
  4.  
  5. 1 test-ex


так?
 

awarm

разработчик l2j-сервера

ага. сейчас проверю.
 
+
-
edit
 

Balancer

администратор
★★★★★
Упс, примечание. Там тебе нужно будет не "ex" прибавлять, а " ex". Слово " в Форте - полноценное слово, но так до сих пор и не реализовано, так что сейчас строки начинаться с пробела не могут. Придётся слово " (двойная кавычка) написать :)
 
+
-
edit
 

Balancer

администратор
★★★★★
Только у меня сейчас JBF в полуразрушенном виде из-за работы со словарями. Так что придётся ждать, пока закончу. Ну, или сам впиши слово "двойная кавычка" в Strings.java - я пока этот файл трогать не собираюсь :)

Принцип работы простой. Слово берёт входной поток до первой найденной квычки. Т.е.
" test" вернёт строку (test).
 

awarm

разработчик l2j-сервера

погоди. или я чего-то не понимаю, или...
code text
  1.     public void exec(String code, JBData data)
  2.     {
  3. ...
  4.             if(word_name.startsWith("""))
  5.             {
  6.                 if(word_name.endsWith("""))
  7.                     literal(rest2, data);
  8.                 else
  9.                     literal(rest1+nextWord(""", data), data);
  10.                 continue;
  11.             }
  12. ...
  13.         return;
  14.     }
  15.  
  16.     public void literal(Object n, JBData data)
  17.     {
  18.         if((Integer)state.get() != 0)
  19.         {
  20.             current_code.add(new Literal(n));
  21.             current_word.Count++;
  22.         }
  23.         else
  24.         {
  25.             data.st.push(n);
  26.         }
  27.     }

разве nextWord(""", data), не вернет все до следующей ковычки? или он пробелы пропускает?
 
+
-
edit
 

Balancer

администратор
★★★★★
Не-а. Потому что одиночная кавычка рассматривается в этом случае как слово, начинающееся, и как заканчивающееся на эту самую кавычку :D
 

awarm

разработчик l2j-сервера

Да понял я уже.
Плохо я все-таки java знаю пока... 2 часа потратил на такую фигню.
Закоммитил.
 

awarm

разработчик l2j-сервера

Блин!
Если из строки - работает, а в файле, при парсинге воспринимает как команду то, что после первой ковычки :(
буду дальше ковырять
 
+
-
edit
 

Balancer

администратор
★★★★★
На самом деле, там всё просто. Есть уже метод, возвращающий всё до заданного символа. Т.е. в слове "кавычка" нужно этот медод вызвать для стандартного потока.

Если не разберёшься - сделаю чуть позже.

Пока я там циклы прикрутил.
 

awarm

разработчик l2j-сервера

Все было еще намного проще.
Не стал я делать отдельное слово, а просто чуть модифицировал JBCore
Закоммитил.
 
+
-
edit
 

Balancer

администратор
★★★★★
Ну, ладно, уговорил :) Всё равно с автоматическим выделением строк наличие слова "кавычка" становится ненужным :)
 
+
-
edit
 

Goodwin

новичок
пара вопросиков:
1. в каких единицах указывается время? в милисекундах?
2. таймер выполняет код один раз или по аналогии с таймерами unix/windows с
заданным интервалом, пока не остановишь его (таймер)?
 

awarm

разработчик l2j-сервера

1. Естественно в миллисекундах.
2. Код выполняется один раз. Обязательно проконтролируй, что-бы он после себя ничего не оставлял в стеке.
 
+
-
edit
 

Goodwin

новичок
сенькс.
awarm:
Обязательно проконтролируй, что-бы он после себя ничего не оставлял в стеке.
 

а стек вообще глобальный или при в каждой функции идет работа с отдельным стеком?
 

awarm

разработчик l2j-сервера

глобальный. я Балансеру говорил, что надо сделать возможность открытия локального стека, он обещал подумать.
 
AD Реклама Google — средство выживания форумов :)
+
-
edit
 

Balancer

администратор
★★★★★
Таймерный стек - локальный на каждого юзера, но общий для всех задач.

Вообще - да, не сообразил сразу, для таймерных задач нужно заводить свой стек.
 

в начало страницы | новое
 
Поиск
Настройки
Твиттер сайта
Статистика
Рейтинг@Mail.ru