Модуль ../src/object.rs определяет внутреннее представление значений (объектов) языка SOFIA, а также среду выполнения (Environment) для хранения переменных. Эти структуры используются интерпретатором (../src/evaluator.rs) для работы с данными во время выполнения программы.
graph TD
A[../src/object.rs] --> B{Object};
B --> C{Class};
B --> D{ClassInstance};
B --> E{Struct};
B --> F{StructInstance};
B --> G{Interface};
B --> H{Method};
B --> I{MethodSignature};
A --> J{Environment};
H --> J;
D --> C;
F --> E;
G --> I;
Перечисление Object является центральным типом в объектной модели SOFIA. Оно инкапсулирует все возможные типы значений, которые могут быть представлены и обработаны в языке.
Integer(i64): Целочисленное значение.Boolean(bool): Булево значение (trueилиfalse).Null: Представляет отсутствие значения.ReturnValue(Box<Object>): Обертка для значений, возвращаемых из функций, чтобы отличать их от обычных значений в блоках кода.Error(String): Представляет ошибку выполнения.Function(Vec<Identifier>, BlockStatement, Rc<RefCell<Environment>>): Представляет функцию, содержащую параметры, тело и замыкающую среду.String(String): Строковое значение.Array(Vec<Object>): Массив объектов.Class(Rc<RefCell<Class>>): Обертка для определения класса.ClassInstance(Rc<RefCell<ClassInstance>>): Обертка для экземпляра класса.Struct(Rc<RefCell<Struct>>): Обертка для определения структуры.StructInstance(Rc<RefCell<StructInstance>>): Обертка для экземпляра структуры.Interface(Rc<RefCell<Interface>>): Обертка для определения интерфейса.Method(Rc<RefCell<Method>>): Обертка для метода класса, связанного с экземпляром.
pub fn type_str(&self) -> &strВозвращает строковое представление типа объекта.
- Возвращает:
&str— Строка, представляющая тип объекта (например, "INTEGER", "BOOLEAN", "CLASS_INSTANCE").
Структура Class представляет определение класса в языке SOFIA.
name:String— Имя класса.super_class:Option<Rc<RefCell<Class>>>— Опциональная ссылка на родительский класс, если класс наследуется.interfaces:Vec<Rc<RefCell<Interface>>>— Вектор ссылок на интерфейсы, которые реализует класс.properties:HashMap<String, Object>— Карта свойств класса, где ключ — имя свойства, значение — его объект.methods:HashMap<String, Rc<RefCell<Method>>>— Карта методов класса, где ключ — имя метода, значение — его определение.
Структура ClassInstance представляет экземпляр класса.
class:Rc<RefCell<Class>>— Ссылка на определение класса, к которому принадлежит этот экземпляр.fields:HashMap<String, Object>— Карта полей экземпляра, где ключ — имя поля, значение — его объект.
Структура Struct представляет определение структуры в языке SOFIA.
name:String— Имя структуры.properties:HashMap<String, Object>— Карта свойств структуры, где ключ — имя свойства, значение — его объект.
Структура StructInstance представляет экземпляр структуры.
struct_def:Rc<RefCell<Struct>>— Ссылка на определение структуры, к которой принадлежит этот экземпляр.fields:HashMap<String, Object>— Карта полей экземпляра структуры, где ключ — имя поля, значение — его объект.
Структура Interface представляет определение интерфейса в языке SOFIA.
name:String— Имя интерфейса.method_signatures:HashMap<String, MethodSignature>— Карта сигнатур методов интерфейса, где ключ — имя метода, значение — его сигнатура.
Структура Method представляет метод класса.
name:String— Имя метода.parameters:Vec<Identifier>— Вектор идентификаторов параметров метода.body:BlockStatement— Тело метода.env:Rc<RefCell<Environment>>— Замыкающая среда, в которой был определен метод.this:Option<Rc<RefCell<ClassInstance>>>— Опциональная ссылка на экземпляр класса, к которому привязан метод (дляthis).
Структура MethodSignature представляет сигнатуру метода, используемую в интерфейсах.
name:String— Имя метода.parameters:Vec<Identifier>— Вектор идентификаторов параметров метода.
Структура Environment представляет среду выполнения, которая хранит переменные и их значения.
store:HashMap<String, Object>— Карта, хранящая переменные (имя -> значение).outer:Option<Rc<RefCell<Environment>>>— Опциональная ссылка на внешнюю (родительскую) среду, реализующая лексическое замыкание.
new() -> Self: Создает новую пустую среду.new_enclosed(outer: Rc<RefCell<Environment>>) -> Self: Создает новую среду, вложенную в другую среду.get(&self, name: &str) -> Option<Object>: Получает значение переменной по имени, сначала ища в текущей среде, затем во внешних.set(&mut self, name: String, val: Object): Устанавливает значение переменной в текущей среде.
use crate::object::{Environment, Object};
use std::cell::RefCell;
use std::rc::Rc;
let mut env = Environment::new();
env.set("x".to_string(), Object::Integer(10));
let val_x = env.get("x").unwrap();
assert_eq!(val_x, Object::Integer(10));
let enclosed_env = Environment::new_enclosed(Rc::new(RefCell::new(env)));
enclosed_env.borrow_mut().set("y".to_string(), Object::Boolean(true));
let val_y = enclosed_env.borrow().get("y").unwrap();
assert_eq!(val_y, Object::Boolean(true));
// Доступ к переменной из внешней среды
let val_x_from_enclosed = enclosed_env.borrow().get("x").unwrap();
assert_eq!(val_x_from_enclosed, Object::Integer(10));