Интеграция
Java
Интеграция с Java

Работа с Java-объектами. Как создать слово с использованием Java ?
Вопрос о взаимодействии с Java уже рассмотрен на странице java.html
Здесь будут рассмотрены дополнительные возможности.

Реализация слова Jpho на Java


Пример. Реализуем простое слово, которое дважды дублирует объект на вершине стека:

( q - q, q, q )

Создаем класс на Java, и реализуем методы invoke и toString, слово назовем 3dup:
package mypackage;

import com.tomaslutas.jpho.*;
import com.tomaslutas.jpho.api.*;
import com.tomaslutas.jpho.exception.*;
import java.util.*;

public class ThreeDup implements JphoInvoke {

  @Override
  public int invoke(Jpho jfo) throws JphoException {
    try {
      JphoStack stack = jfo.getStack();
      Object q = stack.pop();
      stack.push(q);
      stack.push(q);
      stack.push(q);
      return 0;
    }
    catch (EmptyStackException e) {
      throw new JphoStackEmptyException("3dup");
    }
  }
  @Override
  public String toString() {
    return "3dup";
  }
}

Здесь из объекта jfo получаем стек stack, содержащий входные параметры.
Из него с вершины стека извлекаем объект q и трижды выкладываем его в стек.

Расширение словаря в Jpho


Для того чтобы созданное нами новое слово было доступно в текущем словаре, необходимо реализовать класс расширения словаря, и подключить созданное слово к расширению пример:

package mypackage;

import com.tomaslutas.jpho.api.*;
import com.tomaslutas.jpho.*;

public class MyExtVoc implements JphoExtendsVoc {
  public MyExtVoc() { }
  @Override
  public void extendsVoc(Jpho jfo, JphoVocabulary voc) {
    voc.createWithoutException(jfo, "3dup", new ThreeDup());
    // ...
  }
}

В данном случае в функции createWithoutException 3dup - название слова, new ThreeDup() - создание объекта, реализуещего это слово.
Аналогично, можно подключить к этому же расширению и другие слова, реализованные на Java, продолжив функцию createWithoutException.

Подключение расширения словаря в Jpho


Стек: ( class, voc - )

Входной поток(код): extends

Действие: слово extends создает объект расширения словаря (JphoExtendsVoc) по переданному через стек классу class и расширяет словарь voc.

Для нашего случая можно было написать: $class mypackage.MyExtVoc curvoc ,
то есть создать объект расширения словаря MyExtVoc и расширить текущий словарь.

Запуск Jpho из Java класса


Рассмотрим на примере:

package mypackage;

import com.tomaslutas.jpho.api.*;
import com.tomaslutas.jpho.*;

public class MyApp {

  protected Jpho jfo = null;

  public MyApp() {
    initJpho();
  }

  protected void initJpho() {
    jfo = Jpho.createInstance();
    jfo.uload("myfile.jfo");
  }

}

В данном примере при создании объекта MyApp создается объект jfo и выполняется интерпретация файла "myfile.jfo".

Если необходимо расширить словарь при создании объекта MyApp следует дополнить функцию initJpho:
MyExtVoc extv = new MyExtVoc();
extv.extendsVoc(jfo, jfo.getCurrentVoc());