Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

对日语编程语言Nadesiko, なでしこ的功能和源码学习 #46

Closed
nobodxbodon opened this issue Nov 4, 2017 · 6 comments
Closed
Labels
设计 design

Comments

@nobodxbodon
Copy link
Member

nobodxbodon commented Nov 4, 2017

作为#39 中当前发现较有市场和历史的一个开源的母语编程语言项目, 相信会对中文编程语言的开发设计和推广会有所裨益. 这里试图由表及里地学习, 欢迎各位一同.

这是一些背景资料: 官方网站

  • 第三版(最新)源码库, 用JavaScript实现, 代码提交从2017/2至今
  • 第二版源码库, 用C#实现. 代码提交从2010/6到2016/2.
  • 第一版源码库, 用Pascal实现, 最近仍然在更新. 最早代码提交是2008年, 但应该在更早几年前就已经成型.

第三版的一个入门教程中的乌龟图(感觉类似LOGO), 顺便 @TKT2016
screen shot 2017-11-04 at 3 52 28 pm
原文: http://news.mynavi.jp/series/nadeshiko/003/, 上图是gg翻译后的.

@nobodxbodon
Copy link
Member Author

官网只提供了v1(windows版)和v3(浏览器版)的最新版本, 看来v2已经不再发布了. v3也支持本地运行(Win/Linux/Mac), 只要有NodeJS.
v1的功能包括: 日常任务如 文件处理, 图片处理, 网络, Word/Excel处理, 字符/文本处理, 等等. 有上千条指令(猜想是类似核心库)
v3好像只有文件/图片处理和运行shell命令的功能, 也许正在完善中:

File input / output

(S from | S) Open - Open file S
(Read S from | S) - Open file S
(Save S to F) Save --- Write S to file F
(S) Start --- Start shell command S
Acquire current directory --- Return current directory
(DIR to DIR) Change current directory --- Change current directory to DIR
Get working folder --- Return current directory
(DIR to DIR) Change working folder --- Change current directory to DIR
Get mother ship path --- Return directory with script
Get environment variable --- Return a list of environment variables
(S | S with | S) File enumeration --- Get a list of file names (folder names) of path S. Wild cards are possible. Multiple extensions such as "* .jpg; *. Png" can be specified.
(S | S with | S) All files enumeration --- Get all file names under path S. Wild cards are possible. Multiple extension can be specified like "* .jpg; *. Png".
(From S to | S) file name extraction --- Extract and return the file name part from the full path file name S
Extract path (from S to | S) --- extract path part from file name S and return
Presence (PATH is | PATH) Presence --- Check if file PATH exists and return 

@nobodxbodon
Copy link
Member Author

在探究语言设计和实现细节之前, 一点初步的观感. 它的功能看来主要是在桌面任务和系统管理. 特色是实用和易于上手. 但暂时没看到如何和其他语言/框架集成, 也没有看到网络服务/数据库相关的功能, 如果的确如此, 恐怕这些会局限商业用途.

@nobodxbodon
Copy link
Member Author

nobodxbodon commented Nov 6, 2017

V3语法相关(详见: https://nadesi.com/doc3/index.php?文法). 限于日语水平, 对它的示例源码也许有理解出入. 下面尝试把它们转成对应的中文, 词序有不少调整:

第一部分 基本要素

比如:

「こんにちは」と表示

对应:

显示"你好"

基本

显示1+2.
显示FLOOR(3.14).

变量

苹果价格=300
苹果个数=5
显示(苹果价格*苹果个数).

多种方式赋值

价格是3000    //  値段は3000
价格=2000
置价格为4000   // 値段に4000を代入。

计算变量:

价格= 500
数字= 3
税率= 0.08
总金额=价格×数量
税额=总额×税率
付款=总金额+税额
显示“付款是{付款}日元!”

数组和对象

用JSON格式来描述数组和对象(字典类型/散列类型)。

// 数组
A=[1,2,3,4,5]
显示A[0]

// 对象
A={"Jan":1, "Feb":2, "Mar":3, "Apr":4, "May":5, "Jun":6,
   "Sep":7, "Aug":8, "Sep":9, "Oct":10, "Dec":11, "Nov":12}
显示A["Sep"]

简便地访问数组/对象. 因为智能手机很难输入A[n], 因此允许A@n <----这里明智地考虑到了移动设备支持

字符串

除了用""包起字符串, 以及之前演示的用{}内嵌变量, 还有以下特性:
「文字列」内嵌变量会展开, 大引号『文字列』不展开
复杂的字符串可以用S{{{...}}}(三对以上的大括号)表示:

得分是35。 评价是“A”。
成绩报告是S {{{★成績表★
·他的分数是{得分}。
·评价是{评价}。}}}
显示成绩报告。

返回:

★成績表★
・他的分数是35。
・评价是A。

「」『』'' ""都可以用来表示字符串
小结:

「文字列」ー展開
『文字列』ー不展開
文字列{{{ ... }}}ー展開
S{{{...}}}ー展開
R{{{...}}}ー不展開
"文字列"ー不展開
'文字列'ー不展開

数值

支持整数, 小数, 十六进制(0xFF). PI是个常量3.141592653589793

运算

支持×(*), ÷(/)

操作者 角色 描述示例
+ 加法 显示3 + 5
- 减法 显示10 - 5
×或* 乘法 显示2 * 3
÷或/ 显示10/5
其余部分 显示10%3
添加字符串 (3&5)被显示。 #→35
^ 阶乘 (2 ^ 3)被显示。 #8

长文(句子)

'2017/06/30'的'/'替换成'-'后显示  <----其实之前的原文例子里一直都是后置'显示'的, 但中文后置似乎不普适

再如:

加5到30,并乘以2来显示它。
加5到30。 它乘以两倍。 显示它。

上面有的使用, 是一个特色. 个人感觉是匿名变量, 并且在函数没有参数时默认使用. 这是很接近自然语言的指代用法! 例如:

它是“  abc   ”   <--- 后面几行都省略了'它'
空白删除。
大写转换
用“*”替换“A”
显示。

返回*BC

第三部分 扩展语法

可以内嵌JavaScript!!

@nobodxbodon
Copy link
Member Author

nobodxbodon commented Nov 6, 2017

第二部分 控制语法

条件语法:

如果(比较表达式)
#分支1
如果不是
#分支2
直到这里
比较表达式
a = b a和b是平等的
a> b a是否大于b
a> = b或a≥b 是大于还是等于b?
a <b a是否小于b
a≤b或a≤b 是小于还是等于b?
a <> b或a≠b a和b是不同的

例如:

A = 5
如果A = 5
   显示为「OK」
如果不是
   显示为「NG」
直到这里。

else分支可以省略
也可以写在一行:

A = 5
如果A是5,则显示「OK」。

A是5等价于A=5, A不是5<=>A!=5

重复执行

比如:

3次、这里开始
    显示'你好'
直到这里

也可以省略这里开始
可以指定变量为循环次数, '回数'是个保留变量, 可以获得当前循环次数的序号:

N=3
(N)次
  显示「这是第{回数}次」。
直到这里。

也可以这样:

N重复从3到5,这里开始
    显示N
直到这里

添加循环条件:

A = 1
(A <= 5)时,这里开始
    显示A
    A = A + 1
直到这里

也可以遍历:

重复[1,2,3], 这里开始
    显示对象。
直到这里。

上面的对象应该是类似回数的内置变量, 用以返回当前循环对应的值. (推测上面如果是显示{回数}的话, 应该显示0 1 2)
上面也可以用显示它
其他的重复相关的用法还有:

N重复[1,2,3]
    显示N.
直到这里。

对象按照键遍历:

OBJ = {“Jan”:1,“Feb”:2,“Mar”:3,“Apr”:4}
重复OBJ
    显示「{对象键} = {对象}月份」
直到这里。

------- 未完, 还有函数定义相关部分, 局部变量等等 ------

另外注意到一点, 它的字符串很多是用(全角的?)「...」表示, 看来至少并不是尽量用引号的. 这也许和日语的书面语用法一致.

@nobodxbodon
Copy link
Member Author

第二部分 续

函数

定义语法.

下面的●很扎眼

●(参数)[函数名称]是
   #函数定义
直到这里

比如:

# ---函数定义---
●(A和B的)加法是
    返回(A + B)
直到这里
#---函数调用---
显示30和7的加法。

其中可以用, 作为返回的默认值:

●(A和B的)加法是
    它是A + B
    返回
直到这里

上例中即使没有返回, 仍然把的值作为函数返回值
会随着函数执行而更新, 如下示例, 函数体中没有, 但仍然显示50

●(A和B的)加法是
    B添加到A
直到这里
30和7的加法. 显示它.

注: 这个很值得总结一下.
又一个例子:

●删除空白(S)
    用「」替换S的“{制表符}”。
    用「」替换“{新行}”。
    用「」替换「 」。 #全角空格
    用「」替换「 」。 #半角空格
直到这里
「  abc  」删除空白。

递归

●(V与A的B)阶乘
    如果B等于或小于0,则返回V.
    (V * A)与A的(B - 1)阶乘。
直到这里。
显示1与2的3阶乘。   # 返回8
显示1与2的5阶乘。   # 返回32

JavaScript回调事件参数<--- 此处不甚理解

参数可以以数组形式获取event参数的值。

●(A和B的)加法是
  它=参数[0] + 参数[1]
直到这里
显示3和5的加法。

匿名函数

这段还没领会. 原文在https://nadesi.com/doc3/index.php?無名関数について

变量/常量

A是变量
B是常量

顺便初始化:

A是变量=30
B是常量=50

也可以简写:

变量A=30
常量B=50

代码分作多行

A = 1 + 1 + 1 + _
    2 + 2 + 2 + _
    3 + 3 + 3
显示A。

@nobodxbodon
Copy link
Member Author

nobodxbodon commented Jun 30, 2018

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
设计 design
Projects
None yet
Development

No branches or pull requests

2 participants