语言 😼#

我们将 Kork 的编程语言称为 咧嘴猫 (😼) 或 Kork 或简称为 😼。 老实说,这真的不重要(只要 LLM 不会感到困惑!)。在提示中将语言名称设置为您想要的任何名称。 保持简短,以避免在不重要的事情上消耗太多 tokens。 🙃

该语言的语法定义 在此处

这种语言不是特别好,并且非常有限(尤其是在目前)– 它是在几个小时内拼凑起来的,在一些已知的方式上是不正确的(例如,const 实际上不是 const),并且在大多数未知的方面也肯定是不正确的。 🤫

目标不是允许 LLM 编写任意 python 代码。如果您需要任意代码执行,请使用真正的编程语言。

Kork 旨在适应以下场景:人们希望生成小的、受约束的程序,这些程序可以帮助实现以自然语言表达的某些特定任务。

它的设计考虑了以下想法

  • 保持语言的 минимальность 以限制 LLM 可以编写的代码

  • 鼓励 LLM 严重依赖外部函数调用

  • 保持语法与现有语言相似,以便 LLM 可以使用提示中的信息学习如何用它进行编码

  • 阻止 LLM 假设标准库可用

替代方案#

  • 更改语法:基于 S-表达式的语法在一些定性实验中看起来很有希望。

  • 在 python 中实现一个轻量级的 python / typescript 解释器,它支持最少的功能子集。

解释器#

让我们看看 咧嘴猫 解释器。

from kork import run_interpreter
result = run_interpreter("var x = 1; x = x * 10")
result
{'environment': Environment(parent=None, variables={'x': 10}), 'errors': []}

环境反映了解释器完成代码执行后全局符号的状态。

result["environment"].variables
{'x': 10}

语法错误将导致 errors 键被填充。 当前错误不是很有信息量。

run_interpreter("1 = 2")
{'environment': Environment(parent=None, variables={}),
 'errors': [lark.exceptions.UnexpectedToken()]}

RunTimeExceptions 也将出现在 errors 键中。

run_interpreter("x + 1")
{'environment': Environment(parent=None, variables={}),
 'errors': [kork.exceptions.KorkRunTimeException('Variable `x` not found')]}

环境#

解释器可以使用预填充环境运行

from kork import Environment
env = Environment()
env.set_symbol("x", 10)
10

请注意,即使没有使用 letconstvar 关键字,也创建了 y

result = run_interpreter("y = x * 3", environment=env)
result
{'environment': Environment(parent=None, variables={'x': 10, 'y': 30}),
 'errors': []}

外部函数#

用户可以将现有的 python 函数作为外部函数导入。

from kork.foreign_funcs import to_extern_func_def
def foo(s: str) -> str:
    """Foo will reverse a string!"""
    return s[::-1]

下面我们将 python 函数转换为外部函数定义的内部表示。

extern_func_def = to_extern_func_def(foo)
extern_func_def
ExternFunctionDef(name='foo', params=ParamList(params=[Param(name='s', type_='str')]), return_type='str', implementation=<function foo at 0x7f5e68873370>, doc_string='Foo will reverse a string!')

让我们将此函数添加到环境中

env.set_symbol("foo", extern_func_def)
ExternFunctionDef(name='foo', params=ParamList(params=[Param(name='s', type_='str')]), return_type='str', implementation=<function foo at 0x7f5e68873370>, doc_string='Foo will reverse a string!')
result = run_interpreter('var z = foo("meow")', environment=env)

result["environment"].variables["z"]
'woem'