program-in-chinese / overview

中文编程的历史、现状和展望。issue 中进行相关问题的讨论.
https://zhuanlan.zhihu.com/codeInChinese
GNU General Public License v3.0
386 stars 34 forks source link

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

Closed 4b5ent1 closed 5 years ago

4b5ent1 commented 6 years ago

背景:

一开始并没有要设计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目前主要用到的基本概念有:

目前设计的预设词义字很随意,背后没有什么很深的考虑,分为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

4b5ent1 commented 6 years ago

待续。有空接着补。二楼留着填充随手想到的例子。 [定R为redis,R有主为R.master,有从为R.slave或.replica]


image

数有九宫,可用作namespace下的变量集合。九宫[1-9]为后天自然序/从左往右从上到下,负[1-9]为先天自然序,从上往下从右往左;[一至九]为宫序。这个设定主要方便矩阵运算以及兼容三值逻辑/平衡三进制。 九宫可以嵌套,比如宫三三,记为左一格的下属左一格。

image

术有八门,同理。类似极坐标与直角坐标的关系。

4b5ent1 commented 6 years ago

进展:Ld2e。Ld2e是elixir下的简化版演示: 用elixir实现一个简单的中文语句解析》https://zhuanlan.zhihu.com/p/46030123

4b5ent1 commented 5 years ago

这个方案已经属于历史讨论的参考内容了,从Ld2,到Ld2e这个poc,再到CPN+PN2,最后是C8/P语言,基本上意味着主线剧情已经步入正轨