Java

Так как Jfo реализован на языке Java, то существуют механизмы их взаимодействия.

Как создать объект Java на Jfo ?

( list, class - v ) в стек должны быть помещены list - список параметров, class - Class, создаваемого объекта.

Пример может выглядеть так:

( 100 , 255 , 20 ) $class java.awt.Color new - здесь слово new берет из стека Class, список параметров и создаёт объект данного класса.

Отметим, что если на вершине стека вместо объекта list - список параметров будет расположен объект другого типа, то считается, что он яляется единственным аргументом конструктора.

В случае пустого конструктора надо передать в стек пустой список:

() $class java.util.Hashtable new

Другой пример с использованием слова new: :

$class javax.swing.JPanel new: Panel - здесь слово new: берет из стека Class и создаёт объект данного класса, как константу с именем Panel.

Вызвать функцию из объекта Java

( list, v - ret ) в стек должны быть помещены list - список параметров, v - объект.
ret - возвращаемый объект, если таковой имеется.

Отметим, что если на вершине стека вместо объекта list - список параметров будет расположен объект другого типа, то считается, что он яляется единственным аргументом конструктора.

Пример может выглядеть так (создаем объект Hashtable и добавляем в него значение):

() $class java.util.Hashtable new

( "value" , 90 ) swap .put

- здесь первая строка создание объекта Hashtable, он помещается в стек,

swap ставит в нужное положение стека созданный объект.

.put - вызов функции put("value", 90) для данного объекта. Для того, чтобы указать Jfo, что это вызов функции, используется префикс . ("точка").

Использование getters & setters

Часто во многих языках, а в Java вчастности используется открытие атрибутов класса через специальные функции - getter, setter. Пример:

public class Foo {
  protected int nval = 0;
  protected double dval = 0;
  public Foo () { }
  // Определение методов доступа
  public int getNval() { return nval; }
  public void setNval(int v) { nval = v; }
  public double getDval() { return dval; }
  public void setDval(double v) { dval = v; }
}

Получить атрибут nval с использованием метода getNval для объекта класса Foo. В стеке объект данного класса, используем слово:

@nval

в стек выкладывается значение данного атрибута, аналогично @dval для другого атрибута.

Использование setters. Создадим объект класса Foo и установим nval=10 , dval = 5.8:

() $class Foo new 5.8 over !dval 10 over !nval

Отследим пошагово работу стека:

() - ( - list )

$class Foo - ( list - list, class )

new - ( list, class - objfoo )

5.8 - ( objfoo - objfoo, 5.8 )

over - ( objfoo, 5.8 - objfoo, 5.8, objfoo )

!dval - ( objfoo, 5.8, objfoo - objfoo ) атрибут dval установлен

10 - ( objfoo - objfoo, 10 )

over - ( objfoo, 10 - objfoo, 10, objfoo )

!nval - ( objfoo, 10, objfoo - objfoo ) атрибут nval установлен, в стеке объект с установленными атрибутами

То есть для извлечения атрибута: в стеке - объект; слово - с префиксом @ , далее имя атрибута.

Для установки атрибута: в стеке - значение, объект; слово - с префиксом ! , далее имя атрибута.

Использование аннотаций в Java классах

Если вы предполагаете вызывать метод класса и не хотите использовать предыдущие варианты, то можно в реализуемый класс включить аннотации. Пример:

import com.tomaslutas.jpho.annotation.*;

@JphoScope(name="foo")
public class Foo {
  public Foo () { }
  // Определение метода
  @JphoMethod(name="plus")
  public int sum(int a, int b) { return a + b; }
}

Здесь аннотация класса @JphoScope(name="foo") означает, что в этот класс включены Jpho-слова.

Аннотация метода @JphoMethod(name="plus") означает, что этот метод можно будет вызвать с помощью Jpho-слова с префиксом & , пример:

12 29 () $class Foo new &plus

Здесь 12 - первый параметр вызова функции, 29 - второй, далее создание объекта, &plus - вызов метода sum(int, int). В стек возвращается результат выполнения функции.