Closed
Description
背景:
- 关于中文化常用DSL的一些想法:关于中文化常用DSL的一些想法 #72
- @bhuztez :中文编程历史》 中文编程历史 #47
- 优秀的程序语言是不用括号和空格的》https://zhuanlan.zhihu.com/p/33248556
一开始并没有要设计DSL的想法,只是想在python里做如下尝试:
- 通过运算符重载,把python改造的像APL一点
- 把py的class对应成elixir的defmod
- 再仿照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
- SQL DML DDL http://www.cnblogs.com/henryhappier/archive/2010/07/05/1771295.html
- FFI https://en.m.wikipedia.org/wiki/Foreign_function_interface
- FFI https://www.haskell.org/onlinereport/haskell2010/haskellch8.html
next/RFC
- 借鉴prolog/datalog/minikanren,实现逻辑编程