function syms(varargin)
    % SYMS 创建符号变量/符号函数（适配自定义sympy类体系）
    % 语法（与MATLAB原生完全一致）：
    %   syms var1 var2 ...          - 创建普通符号变量（Expr类）
    %   syms var1 var2 ... attr     - 创建带属性的符号变量（attr：real/integer/positive等）
    %   syms func1(func2...)        - 创建符号函数（Function类），如syms f(t) g(x,y)
    %   syms func1(t) attr          - 创建带属性的符号函数，如syms f(t) real
    % 输入：
    %   varargin - 字符串参数，包含变量名/函数定义、属性关键字
    % 输出：
    %   无显式输出，直接在调用者工作区创建符号对象（Expr/Function类）
    % 核心：
    %   - 普通变量：创建sympy.Symbol → 封装为Expr类
    %   - 符号函数：创建sympy.Function → 封装为Function类
    %   - 属性设置：调用assume方法设置变量/函数属性（基于sym函数实现）
    
    % ===================== 步骤1：初始化参数与环境 =====================
    sp = sympy__sp;  % 获取sympy实例
    % 定义支持的合法属性关键字（与sympy/MATLAB对齐）
    valid_attrs = {'commutative', 'real', 'even', 'odd', 'integer', 'positive', 'rational', 'zero', 'nonzero', 'prime'};
    % 分离「变量名/函数定义」和「属性关键字」
    var_names = {};   % 存储待创建的变量/函数名
    attrs = {};       % 存储待应用的属性列表
    
    for i = 1:length(varargin)
        curr_arg = varargin{i};
        % 判断当前参数是否为合法属性
        if ismember(curr_arg, valid_attrs)
            attrs{end+1} = curr_arg;
            attrs{end+1} = true;
        else
            var_names{end+1} = curr_arg;
        end
    end

    if ~isempty(attrs); attr = pyargs(attrs{:}); end

    % 边界判断：若无有效变量名，直接返回（避免报错）
    if isempty(var_names)
        error('SYMS:NoVariables', '未输入有效符号变量/函数名，无法创建对象。');
    end
    
    % ===================== 步骤2：创建带属性的符号对象（核心修改） =====================
    % 遍历所有变量/函数，使用sym函数创建带属性的对象
    for j = 1:length(var_names)
        curr_var = var_names{j};
        pattern = '^(\w+)\s*\((.*)\)$';
        % match paren
        match_result = regexp(curr_var, pattern, 'tokens');
        sp = sympy__sp;
        
        if isempty(match_result) || isempty(match_result{1})
            % create symbol directly
            if isempty(attrs)
                obj = sympy.Symbol(sp.Symbol(curr_var));
            else
                obj = sympy.Symbol(sp.Symbol(curr_var, attr));
            end
            assignin('caller', curr_var, obj);
            continue;
        end
        
        func_name = match_result{1}{1};
        params_str = match_result{1}{2};
        
        % ===================== 2. 解析参数列表 =====================
        if isempty(strtrim(params_str))
            % create function with no arg
            obj = sympy.Function(sp.Function(func_name));
            assignin('caller', curr_var, obj);
            continue;
        else
            % 分割参数（兼容逗号+空格的任意组合）
            param_names = strsplit(strtrim(params_str), ',');
            param_names = strtrim(param_names);  % 去除每个参数的首尾空格
            param_names = param_names(~cellfun(@isempty, param_names));  % 过滤空元素
        end
        % 调用已实现的sym函数，传递变量名和属性（核心：利用sym函数处理属性绑定）
        % 语法：sym(变量名, 属性列表)，适配自定义sym函数的入参逻
        % 无属性：创建普通符号变量/函数
        
        % create symfunc inline
        nparam = length(param_names);
        param_objs = cell(nparam, 1);  % 存储变量对应的sympy对象
        
        for i = 1:length(param_names)
            var_name = param_names{i};
            % 检查父工作区（caller）是否存在该变量
            try
                % 尝试从父工作区获取变量
                var_obj = evalin('caller', var_name);
                % 校验变量类型：必须是Symbol对象
                if ~isa(var_obj, 'sympy.Symbol')
                    new_var = sp.Symbol(var_name);
                    assignin('caller', var_name, sympy.Symbol(new_var));
                    param_objs{i} = new_var;
                else
                    param_objs{i} = getObj(var_obj);  % 复用已有对象的sympy原生对象
                end
            catch
                % 父工作区无该变量，创建Symbol并写入
                if isempty(attrs)
                    obj = sympy.Symbol(sp.Symbol(curr_var));
                else
                    obj = sympy.Symbol(sp.Symbol(curr_var, attr));
                end
                assignin('caller', curr_var, obj);
                param_objs{i} = getObj(obj);
            end
        end
        % ===================== 4. 创建sp.Function函数对象 =====================
        % 创建Function对象
        sp_func = sp.Function(func_name);
        
        % 封装为SpSymbol对象返回（保持与现有类的兼容性）
        obj = sympy.Function(sp_func(param_objs{:}), param_objs);
        assignin('caller', func_name, obj);

    end
end