Skip to content

Ld2:一种基于中文的类SQL的DSL设计思路 #89

Closed
@4b5ent1

Description

@4b5ent1

背景:

一开始并没有要设计DSL的想法,只是想在python里做如下尝试:

  1. 通过运算符重载,把python改造的像APL一点
  2. 把py的class对应成elixir的defmod
  3. 再仿照typescript写一个.d.py

这个方案记为GDPL/draft1[简称Ld1],在尝试的过程中意识到python无法实现APL的左参数结合运算,于是废弃,遂有draft2,也就是在python里另外实现一套DSL[简称Ld2,或芦笛]。


Design of Ld2:用途

构想Ld2的之初,并没有明确的目的,只是想先模拟古代的十进数制运算(十进制不等于十进位制)。后来觉得这样不够实用,于是参考SQL和正则表达式,有想兼容并包的考虑。但是编译SQL的工作远比替代正则要繁琐,故目前先只考虑正则部分的实现。

Ld2:概念

Ld2的很多概念都来自APL一族,比如stdlib一般叫标准库,而在Jsoftware里,叫词典。

Ld2目前主要用到的基本概念有:

  • 字:每一个可读的中文字符,都是字
  • 词:类似J里面的verb,但不限于动词的意思。对应c为宏,对应python可理解为函数
  • 词义字/关键字:Ld2的关键字是指预设的带有词义的单字。与常见编程语言的keyword不同,Ld2的关键字必要时可被替代(根据上下文语义),没有写死在语法解析和编译过程里
  • 关键词:目前没有关键词,故此概念保留
  • 语句:类似erlang里的表达式和J里的sentence。目前语句以文本的形式输入,类似SQL和正则

目前设计的预设词义字很随意,背后没有什么很深的考虑,分为3组共42个:

  • 前十位:定、答、求、得、解、成、设、问、曰、数
  • 后十二位:有、如、故、时、言、和、律、王、生、无、见、文
  • 上九位:用进错退差难将再改,十一位:命对出入行到回化留度知

Ld2:test_d2.py

第一部分:算术/术数

from draft2 import , 

(1)==('一')==-'一'
(2)==-'一加一'
3==(3).==-'再加一'-
4==--'三加一'


=.; -'有数七到十二'
=-'平均数'-  # [平均]一词属stdlib
9.5==-

第二部分:正则

from draft2 import ,,

.-'其为.+'
r'\[\{.+\}\]' == --'[{其}]'-

=; .=--
r'\[\{.+\}\]' == .-'[{.+}]'

Q/A

问:如果业务相关的命名是白话 配上文言的关键词?
对:这个考虑到了,有个折中方案,就是[求]是基于单字的,而[有]和[设]是可以兼容当前的编程语言环境的。
对:设,类似于SQL里的DDL;求,类似SQL的DML;用[有]来声明非单字用词,比如苹果,自行车;比如[设苹果有三百,西瓜有二十,苹果和西瓜为水果]求[水果总数]
对:[定]是用来规范API/统一FFI引用/设置常量,这三个主要用途。比如设[定R为import request][设取为R.get,网址为xxx,求取网址]

ref


next/RFC

  • 借鉴prolog/datalog/minikanren,实现逻辑编程

Metadata

Metadata

Assignees

Type

No type

Projects

No projects

Milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions