aether-azathoth 0.5.3

A lightweight, embeddable domain-specific language (DSL) interpreter with rich standard library
Documentation
// stdlib/set.aether
// Aether 集合(Set)数据结构库
// 提供集合的基本操作,使用数组实现,确保元素唯一性

// ==================== 创建集合 ====================

// 创建一个空集合
Func SET_NEW() {
    Return []
}

// 从数组创建集合(自动去重)
Func SET_FROM_ARRAY(ARR) {
    Set RESULT []
    Set LEN_ LEN(ARR)
    Set I 0
    
    While (I < LEN_) {
        Set ITEM ARR[I]
        If (!SET_CONTAINS(RESULT, ITEM)) {
            Set RESULT PUSH(RESULT, ITEM)
        }
        Set I (I + 1)
    }
    
    Return RESULT
}

// ==================== 基本操作 ====================

// 向集合中添加元素(如果不存在)
// 返回新的集合
Func SET_ADD(SET, ITEM) {
    If (SET_CONTAINS(SET, ITEM)) {
        Return SET
    }
    Return PUSH(SET, ITEM)
}

// 从集合中移除元素
// 返回新的集合
Func SET_REMOVE(SET, ITEM) {
    Set RESULT []
    Set LEN_ LEN(SET)
    Set I 0
    
    While (I < LEN_) {
        If (SET[I] != ITEM) {
            Set RESULT PUSH(RESULT, SET[I])
        }
        Set I (I + 1)
    }
    
    Return RESULT
}

// 检查集合是否包含元素
Func SET_CONTAINS(SET, ITEM) {
    Set LEN_ LEN(SET)
    Set I 0
    
    While (I < LEN_) {
        If (SET[I] == ITEM) {
            Return True
        }
        Set I (I + 1)
    }
    
    Return False
}

// 获取集合大小
Func SET_SIZE(SET) {
    Return LEN(SET)
}

// 检查集合是否为空
Func SET_IS_EMPTY(SET) {
    Return LEN(SET) == 0
}

// 清空集合
Func SET_CLEAR() {
    Return []
}

// ==================== 集合运算 ====================

// 并集:返回包含两个集合所有元素的新集合
Func SET_UNION(SET1, SET2) {
    Set RESULT SET1
    Set LEN_ LEN(SET2)
    Set I 0
    
    While (I < LEN_) {
        Set ITEM SET2[I]
        If (!SET_CONTAINS(RESULT, ITEM)) {
            Set RESULT PUSH(RESULT, ITEM)
        }
        Set I (I + 1)
    }
    
    Return RESULT
}

// 交集:返回两个集合共有的元素
Func SET_INTERSECTION(SET1, SET2) {
    Set RESULT []
    Set LEN_ LEN(SET1)
    Set I 0
    
    While (I < LEN_) {
        Set ITEM SET1[I]
        If (SET_CONTAINS(SET2, ITEM)) {
            Set RESULT PUSH(RESULT, ITEM)
        }
        Set I (I + 1)
    }
    
    Return RESULT
}

// 差集:返回在第一个集合但不在第二个集合的元素
Func SET_DIFFERENCE(SET1, SET2) {
    Set RESULT []
    Set LEN_ LEN(SET1)
    Set I 0
    
    While (I < LEN_) {
        Set ITEM SET1[I]
        If (!SET_CONTAINS(SET2, ITEM)) {
            Set RESULT PUSH(RESULT, ITEM)
        }
        Set I (I + 1)
    }
    
    Return RESULT
}

// 对称差集:返回只在其中一个集合的元素
Func SET_SYMMETRIC_DIFFERENCE(SET1, SET2) {
    Set DIFF1 SET_DIFFERENCE(SET1, SET2)
    Set DIFF2 SET_DIFFERENCE(SET2, SET1)
    Return SET_UNION(DIFF1, DIFF2)
}

// ==================== 集合关系 ====================

// 检查第一个集合是否是第二个集合的子集
Func SET_IS_SUBSET(SET1, SET2) {
    Set LEN_ LEN(SET1)
    Set I 0
    
    While (I < LEN_) {
        If (!SET_CONTAINS(SET2, SET1[I])) {
            Return False
        }
        Set I (I + 1)
    }
    
    Return True
}

// 检查第一个集合是否是第二个集合的超集
Func SET_IS_SUPERSET(SET1, SET2) {
    Return SET_IS_SUBSET(SET2, SET1)
}

// 检查两个集合是否不相交(没有共同元素)
Func SET_IS_DISJOINT(SET1, SET2) {
    Set LEN_ LEN(SET1)
    Set I 0
    
    While (I < LEN_) {
        If (SET_CONTAINS(SET2, SET1[I])) {
            Return False
        }
        Set I (I + 1)
    }
    
    Return True
}

// 检查两个集合是否相等
Func SET_EQUALS(SET1, SET2) {
    If (LEN(SET1) != LEN(SET2)) {
        Return False
    }
    
    Return SET_IS_SUBSET(SET1, SET2)
}

// ==================== 实用函数 ====================

// 将集合转换为数组
Func SET_TO_ARRAY(SET) {
    Return SET
}

// 遍历集合,对每个元素应用函数
// FUNC 应该接受一个参数(元素)
Func SET_FOREACH(SET, FUNC) {
    Set LEN_ LEN(SET)
    Set I 0
    
    While (I < LEN_) {
        FUNC(SET[I])
        Set I (I + 1)
    }
}

// 过滤集合,返回满足条件的元素组成的新集合
// PREDICATE 应该接受一个参数并返回 True/False
Func SET_FILTER(SET, PREDICATE) {
    Set RESULT []
    Set LEN_ LEN(SET)
    Set I 0
    
    While (I < LEN_) {
        Set ITEM SET[I]
        If (PREDICATE(ITEM)) {
            Set RESULT PUSH(RESULT, ITEM)
        }
        Set I (I + 1)
    }
    
    Return RESULT
}

// 映射集合,对每个元素应用函数,返回新集合
// MAPPER 应该接受一个参数并返回转换后的值
Func SET_MAP(SET, MAPPER) {
    Set RESULT []
    Set LEN_ LEN(SET)
    Set I 0
    
    While (I < LEN_) {
        Set MAPPED MAPPER(SET[I])
        If (!SET_CONTAINS(RESULT, MAPPED)) {
            Set RESULT PUSH(RESULT, MAPPED)
        }
        Set I (I + 1)
    }
    
    Return RESULT
}

// 将集合转换为字符串表示
Func SET_TO_STRING(SET) {
    If (SET_IS_EMPTY(SET)) {
        Return "{}"
    }
    
    Set RESULT "{"
    Set LEN_ LEN(SET)
    Set I 0
    
    While (I < LEN_) {
        Set RESULT (RESULT + TO_STRING(SET[I]))
        If (I < (LEN_ - 1)) {
            Set RESULT (RESULT + ", ")
        }
        Set I (I + 1)
    }
    
    Set RESULT (RESULT + "}")
    Return RESULT
}