语言 😼#
我们将 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
请注意,即使没有使用 let
或 const
或 var
关键字,也创建了 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'