45

MLSQL 语法扩展设计

 5 years ago
source link: http://www.jianshu.com/p/ec5627c0cfff?amp%3Butm_medium=referral
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

前言

MLSQL 语法非常简单,只有:

  1. set
  2. select
  3. train/run/predict
  4. save
  5. load

等几种语法。因为MLSQL为了简单起见,对扩展新语法是非常抵触的。比如,用户很希望能查看一张表的schema,在MLSQL中需要这么用:

run command ShowTableExt.`tableName`;

比如杀一个任务,需要这么用:

run command Kill.`jobId`;

虽然已然很简单,但是用户觉得还是不够简洁,用户期待如下的表示方法:

show tableName;
kill jobid;

但是如果加这些,就意味添加了新的语法,需要修改语法文件。那如何简单解决这个冲突呢?

解决方案

我们知道在MLSQL里,ET是扩展性最好的东西,任何功能都可以通过ET来实现。MLSQL内部比如Python支持等也是通过ET实现的。ET对应的其实就是train/run/predict 三个关键字。前面的show table schema, kill job也是通过ET实现的。但是他的语法在简单的场合确实不够简洁。 在不增加新语法的情况下,我们其实可以给一段代码片段重新命名从而实现新的功能。

比如前面的Kill,我们可以这样做:

set kill = '''
-- 注意结尾没有分号
run command Kill.`{}`
''';

接着,我们就获得了一个新的命令,叫kill了,具体这么使用:

!kill "groupid";

MLSQL 如果发现以 ! 开始,则认为是一个命令的开始,然后会寻找该命令的定义,然后执行对应的kill内容。以 ! 开始其实是受到Rust 的macro 调用的启发,Rust 采用以 ! 结尾来区分宏和普通方法的调用。MLSQL以 ! 开始作区分命令和其他脚本指令的调用。

结束语

MLSQL 还提供了include语法,从而实现脚本更好的复用。通过新的类似“宏”的支持,可以让脚本获得更好的复用性。不过这种复用性也让脚本更加复杂,用户应当尽量不要使用而应该去使用系统提供了一些内置的“宏”,比如 !desc 查看表结构, !kill 杀任务等。


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK