Cirru 语法说明

news/2023/12/9 19:33:11 标签: javascript

最近状态不佳代码写不出来, 补一下 Cirru 的文档吧
前一篇 Cirru 的一年回顾好像有不少人看, 但整个项目似乎关注的人不多
我大概梳理一下, 如果有兴趣希望有人能帮我探索 Cirru http://cirru.org

Cirru 是基于 Lisp 的 S 表达式衍生出来的一套缩进语法
大致就是把括号语法当中跟缩进语义重合的部分给简化掉了
稍微明确一点的例子, (+ 1 2 (+ 3 4 (+ 5 6))) 到了 Cirru 里变成了

+ 1 2
  + 3 4
    + 5 6

或者上边的例子不用缩进, 实际上写出来是:

+ 1 2 (+ 3 4 (+ 5 6))

就像是每一行开头结尾的括号都不用了, 假装会被自动加上
但是为了考虑几个奇怪的写法, 实际上会有两个特殊语法

+ 1 2 $ + 3 4 $ + 5 6

其中 $ 意思就是后面的内容全部算在一个括号里, 括号管理起来麻烦嘛
然后还有这样的写法, 括号后面还有单个的值 (+ 1 (+ 2 3) 4 5), 写成这样

+ 1
  + 2 3
  , 4 5

其中的逗号 , 意思是这一行的内容是紧跟在原来的内容后面, 是不打括号的
关于缩进还有个极端的情况, (let ((a 1) (b 2)) (+ a b)) 写成

let
    a 1
    b 2
  + a b

也就是多层缩进会生成的多个括号, 用来表示 Lisp 特殊的意思
另外还有一个地方容易有误区, 就是使用引号, 跟一般的语言是不一样的

print |a
print "|a"
print "|a" "|b"
print "|a b"

Cirru 语法里第一行和第二行是一样的, 因为引号本身不是用来标记字符串的
引号只是用来对付像是第三行第四行这种想写的字段中有特殊字符的内容
其实 |a 在 JavaScript 中完全就是 "a", 前面的 | 只是特殊记号而已
在 CirruScript 当中是 :a 在 Sepal.clj 中是 |a, 你也可以定义别的符号

这确实是非常奇怪的语法, 造成这个情况的原因是, Cirru 原本是为图形化编辑设计的
我之前尝试过不少次想做个好用的图形化编辑器, 但效果不理想

后来觉得用文本的语法来做反而现实一点, 反而能在 GitHub 上先用起来
https://github.com/trending?l=Cirru
图形当中, 每个叶节点都是一快文本, 引号就没必要了, 只有文本需要引号
$, 的缩进和展开, 在图形上直接就是, 在文本里反而麻烦

所以 Cirru 本来想的是把 S 表达式用树状的图形界面做出来的
编程语言解析出来的树很像是分形的结构

明确一点可以参考 Let’s Build A Simple Interpreter 里的图片来理解



文本形态的 Cirru 语法怎么解析, 可以尝试这里 JavaScript 写的例子
http://repo.cirru.org/parser/

如果熟悉 AST 或者解释器, 会知道这是编程语言实现过程中很基础的玩具
事实上最近我也弄出了个微博专门整理关于这方面的资料
http://weibo.com/webassembly
有了 AST, 高级语言生成 AST, 底层代码又从 AST 生成, 所以很重要
这某种程度也算是 IR: Intermediate Representation(中间表示)
现在我已经用 CirruScript 和 Sepal.clj 来生成 JavaScript 和 Clojure 了
下一步希望用来生成 WebAssembly, 而且已经尝试了一下
势单力薄不知能走多远, 有兴趣的同学可以关注下, 也欢迎到微博私信我

补充一下免得误解, Cirru 对应的是语法树, AST 是指的抽象语法树
AST 会带更多信息, ES6 AST 比语法树复杂一点点, Clojure AST 非常复杂
Lisp 系语言有时说代码表示 AST, 但也许没把内部实现说明确, 说不准的
关于 AST 还可以看下这里 https://www.zhihu.com/question/20346372


http://www.niftyadmin.cn/n/1577862.html

相关文章

Subsets 子集系列问题 leetcode

子集系列问题: Coding 问题中有时会出现这样的问题:给定一个集合,求出这个集合所有的子集(所谓子集,就是包含原集合中的一部分元素的集合)。 或者求出满足一定要求的子集,比如子集中元素总和为定值,子集元素…

linux基础---smb配置

一、samba简介1、概述:对于windows的网上邻居来讲,共享文件的方式用的是SMB和CIFS协议以及NETBIOS协议Linux/Unix之间用的是NFS协议。但是Linux和Windows之间是不能共享的,所以澳大利亚国立大学的Andrew Tridgell,决定开发一款软件…

带你成为JAVA架构师(写架构,非用架构)

很多人做java开发2,3年后,都会感觉自己遇到瓶颈。什么都会又什么都不会,如何改变困境,为什么很多人写了7,8年还是一个码农,工作中太多被动是因为不懂底层原理。公司的工作节奏又比较快,难有机会学习架构原理…

android中LayoutParams设置参数的理解

1. 有这样的一个应用场景:有一个linearLayout控件在其中布局一个textView控件 首先,创建线性布局对象 LinearLayout layout new LinearLayout(this);//为本Activity创建一个线性布局对象 //并且设置它的属性 android:layout_width 与 android:layout_he…

Java程序员如何成为优秀的架构师

怎样学习才能从一名Java初级程序员成长为一名合格的架构师,或者说一名合格的架构师应该有怎样的技术知识体系,这是不仅一个刚刚踏入职场的初级程序员也是工作三五年之后开始迷茫的老程序员经常会问到的问题。 什么是架构,什么是架构师&#x…

Java Script 第三节课 Java Script的变量 2.进制;布尔类型;null值。

<!DOCTYPE html><html><head><meta charset"utf-8"><title></title></head><body><script type"text/javascript"> //十进制 var a12; a-23; a12.3; a.23e4; a2e3; a3E-2; //十六进制 a0xABCDEF; a…

Java程序员的黄金5年你如何突破

在Java程序界流行着一种默认的说法叫“黄金5年”&#xff0c;也就是一个程序员从入职的时候算起&#xff0c;前五年的选择直接影响着整个职业生涯中的职业发展方向和薪资走向&#xff0c;如何走好这5年&#xff0c;彻底从一个刚入行的菜鸟蜕变成可以以不变应万变的职业大牛&…

[转载]SVN使用教程

SVN简介&#xff1a; 为什么要使用SVN&#xff1f; 程序员在编写程序的过程中&#xff0c;每个程序员都会生成很多不同的版本&#xff0c;这就需要程序员有效的管理代码&#xff0c;在需要的时候可以迅速&#xff0c;准确取出相应的版本。 Subversion是什么&#xff1f; 它是一…

Java程序员如何成为内功深厚的架构师

一听到架构师&#xff0c;首先便想到的是在一间宽敞的房间中间坐着一位衣着得体的中年男人&#xff0c;望着落地窗外的风景凝思&#xff0c;万千思绪在脑海里翻腾&#xff0c;颇有运筹帷幄千里外的气势。程序员究竟是做架构师还是项目经理&#xff0c;最近看到微软潘正磊女士的…

android 开发积累

1.ListView滚动黑屏问题 ListView滚动时&#xff0c;数据项变成黑色 问题解决办法&#xff1a;通过添加 android:cacheColorHint "#00000000" 将背景设为透明即可 2.OnScrollListener回调分析 [java] view plaincopy new OnScrollListener() { boolean…

年薪二十、三十、四十万的Java程序员的生活现状

深圳程序员 把年终奖金这种虚无的算上&#xff0c;刚好过了20的线&#xff0c;此外又是从始至终从事软件行业。符合题目的20码农的要求。 二、本人情况&#xff0c; 1、毕业时有幸落户北京&#xff0c;集体户口。&#xff08;非常感谢我的第一任领导&#xff0c;他在我刚刚入职…

国内外12个免费域名解析服务网站推荐

一般域名使用注册商提供的域名解析服务虽然方便&#xff0c;但功能大多有限&#xff0c;特别是目前国内还会针对某些DNS服务器进行屏蔽&#xff0c;造成网站无法解析的情况出现&#xff0c;因此&#xff0c;使用第三方域名解析服务也是中国网站的必要选择&#xff0c;这里就介绍…

一个Java程序员跟大家谈谈从业心得

貌似这一点适应的行业最广&#xff0c;但是我可以很肯定的说&#xff1a;当你从事web开发一年后&#xff0c;重新找工作时&#xff0c;才会真实的感受到这句话。 工作第一年&#xff0c;往往是什么都充满新鲜感&#xff0c;什么都学习&#xff0c;冲劲十足的一年&#xff1b;WE…

凸优化

http://web.stanford.edu/~boyd/cvxbook/转载于:https://www.cnblogs.com/Wanggcong/p/5111661.html

Java程序员如何月薪达到两万,需要技术水平达到什么程度?

有人说这只能是大企业或者互联网企业工程师才能拿到。也许是的&#xff0c;小公司或者非互联网企业拿两万的不太可能是码农了&#xff0c;应该已经转管理。还有区域问题&#xff0c;这个不在我的考虑范围内&#xff0c;因为除了北上广深杭&#xff0c;其他地方也很难达到。 还有…

Java程序员该如何突破瓶颈,提升自己的知识体系呢?

很多人做Java开发2&#xff0c;3年后&#xff0c;都会感觉自己遇到瓶颈。什么都会又什么都不会&#xff0c;如何改变困境&#xff0c;为什么很多人写了7,8年还是一个码农&#xff0c;工作中太多被动是因为不懂底层原理。公司的工作节奏又比较快&#xff0c;难有机会学习架构原理…
最新文章