SoulverCore Icon

什么是 SoulverCore?

SoulverCore 是流行的记事本计算器 Soulver 使用的自然语言数学引擎。

SoulverCore 的主要设计目标是:

在考虑将 SoulverCore 用于您的项目时,请注意以下事项:

要求

使用 Swift Package Manager (SPM) 安装

在 Xcode 中,转到“File(文件)”>“Swift Packages(Swift 包)”>“Add Package Dependency(添加包依赖项)”,然后粘贴此存储库的 URL (https://github.com/soulverteam/SoulverCore)。

手动安装

克隆此存储库,并将 SoulverCore.xcframework 拖到 Mac 或 iOS 目标的“General(通用)”设置的“Frameworks, Libraries, and Embedded Content(框架、库和嵌入式内容)”部分。

入门

要计算单个表达式的结果,请使用 Calculator 对象

import SoulverCore

let calculator = Calculator(customization: .standard)
let result = calculator.calculate("123 + 456")
print("The answer is \(result.stringValue)") // prints 579

SoulverCore 可以执行各种计算,包括单位转换、日期和日历数学、速率计算、百分比短语函数、时区转换等等。 它还会巧妙地忽略“无意义”的词语

calculator.calculate("$10 for lunch + 15% tip") // $11.50
calculator.calculate("65 kg in pounds") // 143.3 lb
calculator.calculate("40 as % of 90") // 44.44%
calculator.calculate("$150 is 25% on what") // $120
calculator.calculate("$25/hour * 14 hours of work") // $350.00
calculator.calculate("January 30 2020 + 3 months 2 weeks 5 days") // May 19, 2020
calculator.calculate("9:35am in New York to Japan") // 10:35 pm
calculator.calculate("$25k over 10 years at 7.5%") // $51,525.79 (compound interest)

变量

使用 VariableList 设置表达式中单词或短语的值

let variableList = VariableList(variables:
    [
        Variable(name: "a", value: "123"),
        Variable(name: "b", value: "456"),
    ]
)
calculator.calculate("a + b", with: variableList) // 579        

区域设置

SoulverCore 遵循系统区域设置的小数点分隔符和千位分隔符。 或者,您可以将标准 EngineCustomization 转换为另一个区域设置

let europeanLocale = Locale(identifier: "en_DE")
let localizedCustomization = EngineCustomization.standard.convertTo(locale: europeanLocale)

let calculator = Calculator(customization: localizedCustomization)

 /// In Germany a comma is used as a decimal separator
calculator.calculate("1,2 + 3,4") // 4,6

输出格式

使用 FormattingPreferences 自定义结果的格式(包括多少位小数,是否应插入千位分隔符等)。

var formattingPreferences = FormattingPreferences()
formattingPreferences.dp = 2 // decimal places
calculator.formattingPreferences = formattingPreferences

calculator.calculate("π") // 3.14

实时真实世界和加密货币汇率

.standard EngineCustomization 使用硬编码的汇率,适用于 190 种真实世界和加密货币。 您可以(并且应该)通过将 EngineCustomization 上的 currencyRateProvider 设置为符合 CurrencyRateProvider 的对象,为 SoulverCore 提供最新的汇率。

SoulverCore 包含一个 CurrencyRateProvider,您可以使用它从 欧洲中央银行 获取 33 种流行的法定货币的汇率。

/// This is a currency rate provider that fetches 33 popular fiat currencies from the European Central Bank, no API key required
let ecbCurrencyRateProvider = ECBCurrencyRateProvider()

/// Create a customization with this rate provider
var customizationWithLiveCurrencyRates = EngineCustomization.standard
customizationWithLiveCurrencyRates.currencyRateProvider = ecbCurrencyRateProvider

/// Create a calculator that uses this customization
let calculator = Calculator(customization: customizationWithLiveCurrencyRates)

/// Update to the latest rates...
ecbCurrencyRateProvider.updateRates { success in
    
    if success {
        // The standard customization will now have access to the latest currency rates
        let result = calculator.calculate("10 USD in EUR")
        print(result.stringValue)
    }

}

您可以创建自己的符合 CurrencyRateProvider 的对象,以提供您支持的货币代码的汇率。 CurrencyRateProvider 协议具有一个单一方法,该方法返回 1.0 美元可以购买给定货币的数量

func rateFor(request: CurrencyRateRequest) -> Decimal? {

	let currencyCode = request.currencyCode // EUR, GBP, BTC, etc

	/// - Return an up-to-date rate in the form of how much 1 USD can purchase of the requested currency (i.e 1 USD = x EUR?)
	/// - If your rates are in terms of how much USD the requested currency can purchase (i.e 1 EUR = x USD?), remember to take the inverse by dividing 1 by your rate
            
	return <# Currency Rate #>
}

汇率仅在评估时从 CurrencyRateProvider 请求,因此当您的货币汇率数据源更新时,您无需使用新的 EngineCustomization 重新创建 Calculator。 但是,您必须重新评估您的行或表达式:如果需要,将从您的提供商处获取任何使用的货币的最新汇率。

自定义单位

您可以将自定义单位添加到 Calculator 上的初始化程序所需的 EngineCustomization 对象

/// A good omakase EngineCustomization (the same used by Soulver.app)
var customization: EngineCustomization = .standard

/// Set an array of custom units defined in terms of an existing unit in SoulverCore
customization.customUnits = [
    CustomUnit(name: "parrots", definition: 15, equivalentUnit: .centimeters),
    CustomUnit(name: "python", definition: 570, equivalentUnit: .centimeters)
]

/// Create a Calculator using this customization
let calculator = Calculator(customization: customization)

/// python and parrots are now recognized as units
calculator.calculate("1 python in parrots") // 38 parrots

自定义函数

SoulverCore 中函数的语法是灵活的。 我们支持传统的 C 风格的“func(x)”函数、Swift 风格的“calculate(withParameter: x)”函数,甚至像“calculate x”这样的自然短语。

您可以将自定义函数对象添加到 Calculator 上的初始化程序所需的 EngineCustomization。 这是一个自定义函数的示例,该函数从给定数字中减去 1

/// Get the default Engine Customization
var customization: EngineCustomization = .standard

/// A prototype expression is an example of what the user will type to invoke your function
/// - For example, the following function will trigger for any phrase with the form 'number before x', where x is some number

customization.customFunctions = [CustomFunction(prototypeExpression: "number before 9", handler: { parameters in
    
    guard let parameterDecimalValue = parameters[0].decimalValue else {
        return EvaluationResult.none
    }
    
    return .decimal(parameterDecimalValue - 1.0)
    
})]

let calculator = Calculator(customization: customization)
let result = calculator.calculate("number before 35")

print(result.stringValue) // prints '34'

变量声明

变量声明是后跟等号和值的任何短语(即“total expenses = 123”)。

变量声明默认情况下处于关闭状态,但可以在 EngineCustomization 上启用,并在 CalculatorLineCollection 上使用。

/// Get the default Engine Customization
var customization: EngineCustomization = .standard

/// Add the variable declarations feature
customization.featureFlags.variableDeclarations = true

/// Use this customization with a new Calculator object
let calculator = Calculator(customization: customization)
_ = calculator.calculate("discount = 10%")
let result = calculator.calculate("$45k - discount") // $40,500.00

性能

SoulverCore 在不到半毫秒的时间内评估计算 ⚡️! 因此,虽然 SoulverCore 类是线程安全的,但它非常快,通常不需要在应用程序的主线程之外执行单个计算。

本地化

除了英语,SoulverCore 还完全本地化为德语、俄语、法语、西班牙语和简体中文。

这些不同语言环境的各种数字和日期格式也得到完全支持。

另请注意,非英语语言是累加的,这意味着,例如,德国用户将能够同时使用英语和德语语法。

更多信息

您可以在 此处 浏览 SoulverCore 的完整文档。

或者,与 Xcode 或 Dash 兼容的 DocC 档案 也可从 下载

另请参阅

从字符串进行自然语言日期解析

SoulverCore 包含一个强大的自然语言日期解析引擎,它比 Foundation 的 DataDetector 更通用。

请参阅 NaturalLanguageDateParsing 了解 SoulverCore 如何帮助您从字符串中解析自然语言日期,并且可以用于向您的计划或日历应用程序添加自然语言日期输入字段(类似于 ThingsFantastical 中找到的功能)。

从字符串中提取数据

请参阅 SoulverStringParsing 了解 SoulverCore 如何帮助您以类型安全的方式从字符串中解析数据。 它使用自然且令人难忘的语法,对于许多任务而言,它比正则表达式更易于使用。

向 NSTextView 或 UITextView 添加计算功能

请参阅 SoulverTextKit 项目,了解如何将 SoulverCore 数学引擎集成到标准 macOS 或 iOS 文本视图中。

使用 SoulverCore 的应用程序类型

Spotlight 替代品

记事本

快捷方式操作提供程序

许可

您可以在个人或私人项目中使用 SoulverCore。 如果您希望在公开可用或商业项目中使用 SoulverCore,请 给我们发送电子邮件

我们根据您的用户群规模提供各种选项,包括免费许可(带有署名)。