文档章节

为什么不看好TinyScript

乌龟壳
 乌龟壳
发布于 2017/08/11 13:41
字数 490
阅读 126
收藏 0

原贴

我就拿第一个问题作为例子,注意代码结构的思路,可能我算法用得不对,确实我对数学不敏感。

用1、2、2、3、4、5这六个数字,打印出所有不同的排列,如:512234、412345等,要求:"4"不能在第三位,"3"与"5"不能相连。

package test.wuguike;

public class TestSort {

	public static void main(String[] args) {
		permuteAll((e) -> {
			if (e[3] != 4 && !(Math.abs(indexOf(e, 3) - indexOf(e, 5)) == 1)) {
				pl(e);
			}
			return true;
		}, 1, 2, 2, 3, 4, 5);
	}

	private static interface permuteItor {
		boolean next(int[] nums);
	}

	private static void permuteAll(permuteItor itor, int... nums) {
		int[] buffer = new int[nums.length];
		for (int i = 0; i < nums.length; i++) {
			for (int j = i + 1; j < nums.length; j++) {
				for (int k = 0; k < nums.length; k++) {
					if (k == i) {
						buffer[k] = nums[j];
					} else if (k == j) {
						buffer[k] = nums[i];
					} else {
						buffer[k] = nums[k];
					}
				}
				if (itor.next(buffer)) {
					// continue
				} else {
					return;
				}
			}
		}
	}

	private static int indexOf(int[] src, int target) {
		for (int i = 0; i < src.length; i++) {
			if (src[i] == target) {
				return i;
			}
		}
		return -1;
	}

	private static void pl(int[] nums) {
		StringBuilder sb = new StringBuilder();
		sb.append("[");
		for (int i = 0; i < nums.length; i++) {
			if (i > 0) {
				sb.append(", ");
			}
			sb.append(nums[i]);
		}
		sb.append("]");
		System.out.println(sb);
	}

}

各位看官如果明白的,应该就知道我在讲什么了。虽然java版比tinyscript代码量大,但最主要的就是因为java没有现成的permuteAll的封装。所以针对这个问题,最合适的方法是增加一个封装而不是设计一门新语言。增加封装后也看起来很简单直观了。

我之前的博客里有讲过这个问题:语言和封装那些事

王垠最近也讲过这个问题:DSL

注:偏激的会理解成我全面否定TinyScript,非也非也。我只是觉得这种东西没必要通过新语言的方式去展现。并没有去否定比如permuteAll等API的设计,这些是超越语言层面的,而且占了很大比重的工作量。所以从代码量去估算,我反对的是TinyScript中10%不到的部分而已。

© 著作权归作者所有

乌龟壳

乌龟壳

粉丝 115
博文 22
码字总数 13436
作品 0
深圳
程序员
私信 提问
加载中

评论(11)

乌龟壳
乌龟壳 博主

引用来自“悠悠然然”的评论

谢谢对 #tinyscript 的关注,如果tinyscript只是一个permuation的封装,那你说的是对的。
但是,这只是一点点内嵌的集合处理的支持,实际上提供的特性比这个多的多。
更多的特性我会在真正的介绍文章中说明。

所以,我的例子本事就是片面的展示部分特性,你的评估也建立在这个基础之上,所以.....
敬请关注tinyscript后续内容,再次感谢。

引用来自“乌龟壳”的评论

这看法都来源于之前那篇一箩筐算法比较的帖子,无论你说的tinyscript还有多少多少内容,但是对于那篇帖子来说,会让人觉得【API设计得好等于新做一门语言很有必要】这样的倾向,后面有人也回复了“拿内置函数和完整算法比有意思吗”,这其实和我这个博文说的是一个意思。

我之前大概了解过tinyscript你写的一些介绍,主要包括一些矩阵运算和数据库操作的特殊语法等。
动态类型书写方便和静态类型之间的权衡,我倾向于基于后者设计API(就算有点别扭)。
你会说我没了解过需求,这个需求是无法设计出好用的API云云,那就等更多资料上来了再继续讨论吧。

毕竟博客只是发表个人看法的地方,不是发表论文的地方,很多话也是随性而说,如果非要方方面面都要讲清楚,我必须完全理解你的需求,然后按我的思路成功重新设计一套API,然后才能开口和你说“TinyScript不该用新语言的形式”,这样也太累了,嘿嘿。

引用来自“李嘉图”的评论

这种数学分析之类的,java本身就不擅长,明显要R语言的(tiobe现在排名11,流行成都可想而知?),是专门为统计和数据分析开发的语言,各种功能和函数琳琅满目,其中成熟稳定的一抓一把,所以你举个小栗子,想换一下思路
但是,在这个不缺轮子的年代,为什么有桥不走,非要摸着石头过河?
最后,我声明一下,虽然我没接触过用过R语言,但我觉得这种permuteAll数学函数,R语言绝对有,而且有的更多
语言也好API也好只是表象,内部的逻辑算法还是要人一行一行去实现的。
这里讨论的是permuteAll用API呈现功能还是新语言呈现的抉择。R我也没接触过,嗯,事实上是比较抵触动态类型语言做大规模开发。
李嘉图
李嘉图

引用来自“悠悠然然”的评论

谢谢对 #tinyscript 的关注,如果tinyscript只是一个permuation的封装,那你说的是对的。
但是,这只是一点点内嵌的集合处理的支持,实际上提供的特性比这个多的多。
更多的特性我会在真正的介绍文章中说明。

所以,我的例子本事就是片面的展示部分特性,你的评估也建立在这个基础之上,所以.....
敬请关注tinyscript后续内容,再次感谢。

引用来自“乌龟壳”的评论

这看法都来源于之前那篇一箩筐算法比较的帖子,无论你说的tinyscript还有多少多少内容,但是对于那篇帖子来说,会让人觉得【API设计得好等于新做一门语言很有必要】这样的倾向,后面有人也回复了“拿内置函数和完整算法比有意思吗”,这其实和我这个博文说的是一个意思。

我之前大概了解过tinyscript你写的一些介绍,主要包括一些矩阵运算和数据库操作的特殊语法等。
动态类型书写方便和静态类型之间的权衡,我倾向于基于后者设计API(就算有点别扭)。
你会说我没了解过需求,这个需求是无法设计出好用的API云云,那就等更多资料上来了再继续讨论吧。

毕竟博客只是发表个人看法的地方,不是发表论文的地方,很多话也是随性而说,如果非要方方面面都要讲清楚,我必须完全理解你的需求,然后按我的思路成功重新设计一套API,然后才能开口和你说“TinyScript不该用新语言的形式”,这样也太累了,嘿嘿。
这种数学分析之类的,java本身就不擅长,明显要R语言的(tiobe现在排名11,流行成都可想而知?),是专门为统计和数据分析开发的语言,各种功能和函数琳琅满目,其中成熟稳定的一抓一把,所以你举个小栗子,想换一下思路
但是,在这个不缺轮子的年代,为什么有桥不走,非要摸着石头过河?
最后,我声明一下,虽然我没接触过用过R语言,但我觉得这种permuteAll数学函数,R语言绝对有,而且有的更多
悠悠然然
悠悠然然

引用来自“悠悠然然”的评论

谢谢对 #tinyscript 的关注,如果tinyscript只是一个permuation的封装,那你说的是对的。
但是,这只是一点点内嵌的集合处理的支持,实际上提供的特性比这个多的多。
更多的特性我会在真正的介绍文章中说明。

所以,我的例子本事就是片面的展示部分特性,你的评估也建立在这个基础之上,所以.....
敬请关注tinyscript后续内容,再次感谢。

引用来自“乌龟壳”的评论

这看法都来源于之前那篇一箩筐算法比较的帖子,无论你说的tinyscript还有多少多少内容,但是对于那篇帖子来说,会让人觉得【API设计得好等于新做一门语言很有必要】这样的倾向,后面有人也回复了“拿内置函数和完整算法比有意思吗”,这其实和我这个博文说的是一个意思。

我之前大概了解过tinyscript你写的一些介绍,主要包括一些矩阵运算和数据库操作的特殊语法等。
动态类型书写方便和静态类型之间的权衡,我倾向于基于后者设计API(就算有点别扭)。
你会说我没了解过需求,这个需求是无法设计出好用的API云云,那就等更多资料上来了再继续讨论吧。

毕竟博客只是发表个人看法的地方,不是发表论文的地方,很多话也是随性而说,如果非要方方面面都要讲清楚,我必须完全理解你的需求,然后按我的思路成功重新设计一套API,然后才能开口和你说“TinyScript不该用新语言的形式”,这样也太累了,嘿嘿。
嗯嗯,所以我没有说你说错了呀,也没有要求你一定不偏差,只是说:由于我的案例导致大家有这样的结论。
我不反对讨论, 也不苛求别人完全正确,只要关注不管是正面还是负面,对我都是有帮助的,期待后续继续讨论。
乌龟壳
乌龟壳 博主

引用来自“悠悠然然”的评论

谢谢对 #tinyscript 的关注,如果tinyscript只是一个permuation的封装,那你说的是对的。
但是,这只是一点点内嵌的集合处理的支持,实际上提供的特性比这个多的多。
更多的特性我会在真正的介绍文章中说明。

所以,我的例子本事就是片面的展示部分特性,你的评估也建立在这个基础之上,所以.....
敬请关注tinyscript后续内容,再次感谢。
这看法都来源于之前那篇一箩筐算法比较的帖子,无论你说的tinyscript还有多少多少内容,但是对于那篇帖子来说,会让人觉得【API设计得好等于新做一门语言很有必要】这样的倾向,后面有人也回复了“拿内置函数和完整算法比有意思吗”,这其实和我这个博文说的是一个意思。

我之前大概了解过tinyscript你写的一些介绍,主要包括一些矩阵运算和数据库操作的特殊语法等。
动态类型书写方便和静态类型之间的权衡,我倾向于基于后者设计API(就算有点别扭)。
你会说我没了解过需求,这个需求是无法设计出好用的API云云,那就等更多资料上来了再继续讨论吧。

毕竟博客只是发表个人看法的地方,不是发表论文的地方,很多话也是随性而说,如果非要方方面面都要讲清楚,我必须完全理解你的需求,然后按我的思路成功重新设计一套API,然后才能开口和你说“TinyScript不该用新语言的形式”,这样也太累了,嘿嘿。
悠悠然然
悠悠然然
谢谢对 #tinyscript 的关注,如果tinyscript只是一个permuation的封装,那你说的是对的。
但是,这只是一点点内嵌的集合处理的支持,实际上提供的特性比这个多的多。
更多的特性我会在真正的介绍文章中说明。

所以,我的例子本事就是片面的展示部分特性,你的评估也建立在这个基础之上,所以.....
敬请关注tinyscript后续内容,再次感谢。
乌龟壳
乌龟壳 博主

引用来自“罗格林”的评论

我现在的感觉是这种问题不应该作为语言或者库的封装存在,首先是不是一个普遍性的功能,其次算法可以随着具体需求不同而不同.所以只有当具体应用出现之后才应该去考虑.比如正则表达式解析会有生成 permuation 的需求, 在 java.util.regex.Pattern 类中就有一个 private String[] producePermutations(String input) 方法. 但是这种方法不会放到 String 的公共静态工具方法中

引用来自“乌龟壳”的评论

首先就是吐槽下String的设计,replaceAll(normal string, normal string)硬是找不到,非要用replaceAll(regex string, regex string),有时候相当不爽,如果随便写个regex,每次调用都会在内部默默Pattern.compile,不是我期望的执行过程

另外就是感觉你木有get到我想表达的点——有时候我们只是需要一个封装,而不是一门新的语言,更何况一门新的纯粹就为了换种方式表达逻辑的动态类型语言,对代码一点保障都没有。

引用来自“罗格林”的评论

顺便说下 Java 9 的字串替换函数会有新的实现:

https://bugs.openjdk.java.net/browse/JDK-8058779
谢谢
罗格林
罗格林

引用来自“罗格林”的评论

我现在的感觉是这种问题不应该作为语言或者库的封装存在,首先是不是一个普遍性的功能,其次算法可以随着具体需求不同而不同.所以只有当具体应用出现之后才应该去考虑.比如正则表达式解析会有生成 permuation 的需求, 在 java.util.regex.Pattern 类中就有一个 private String[] producePermutations(String input) 方法. 但是这种方法不会放到 String 的公共静态工具方法中

引用来自“乌龟壳”的评论

首先就是吐槽下String的设计,replaceAll(normal string, normal string)硬是找不到,非要用replaceAll(regex string, regex string),有时候相当不爽,如果随便写个regex,每次调用都会在内部默默Pattern.compile,不是我期望的执行过程

另外就是感觉你木有get到我想表达的点——有时候我们只是需要一个封装,而不是一门新的语言,更何况一门新的纯粹就为了换种方式表达逻辑的动态类型语言,对代码一点保障都没有。
顺便说下 Java 9 的字串替换函数会有新的实现:

https://bugs.openjdk.java.net/browse/JDK-8058779
罗格林
罗格林

引用来自“罗格林”的评论

我现在的感觉是这种问题不应该作为语言或者库的封装存在,首先是不是一个普遍性的功能,其次算法可以随着具体需求不同而不同.所以只有当具体应用出现之后才应该去考虑.比如正则表达式解析会有生成 permuation 的需求, 在 java.util.regex.Pattern 类中就有一个 private String[] producePermutations(String input) 方法. 但是这种方法不会放到 String 的公共静态工具方法中

引用来自“乌龟壳”的评论

首先就是吐槽下String的设计,replaceAll(normal string, normal string)硬是找不到,非要用replaceAll(regex string, regex string),有时候相当不爽,如果随便写个regex,每次调用都会在内部默默Pattern.compile,不是我期望的执行过程

另外就是感觉你木有get到我想表达的点——有时候我们只是需要一个封装,而不是一门新的语言,更何况一门新的纯粹就为了换种方式表达逻辑的动态类型语言,对代码一点保障都没有。
嗯, 理解你的意思.

关于 String 的设计, 其实性能不像想象中那么慢. 我这里有个 Benchmark 你可以看看: https://github.com/greenlaw110/Benchmark4StringReplace
乌龟壳
乌龟壳 博主

引用来自“罗格林”的评论

我现在的感觉是这种问题不应该作为语言或者库的封装存在,首先是不是一个普遍性的功能,其次算法可以随着具体需求不同而不同.所以只有当具体应用出现之后才应该去考虑.比如正则表达式解析会有生成 permuation 的需求, 在 java.util.regex.Pattern 类中就有一个 private String[] producePermutations(String input) 方法. 但是这种方法不会放到 String 的公共静态工具方法中
首先就是吐槽下String的设计,replaceAll(normal string, normal string)硬是找不到,非要用replaceAll(regex string, regex string),有时候相当不爽,如果随便写个regex,每次调用都会在内部默默Pattern.compile,不是我期望的执行过程

另外就是感觉你木有get到我想表达的点——有时候我们只是需要一个封装,而不是一门新的语言,更何况一门新的纯粹就为了换种方式表达逻辑的动态类型语言,对代码一点保障都没有。
罗格林
罗格林
我现在的感觉是这种问题不应该作为语言或者库的封装存在,首先是不是一个普遍性的功能,其次算法可以随着具体需求不同而不同.所以只有当具体应用出现之后才应该去考虑.比如正则表达式解析会有生成 permuation 的需求, 在 java.util.regex.Pattern 类中就有一个 private String[] producePermutations(String input) 方法. 但是这种方法不会放到 String 的公共静态工具方法中
tinyscript之序表操作

经常操作数据的同学们一定对序表这个名词很熟悉,从结构上来说跟数据库的表结构是类似的。tinyscript的序表是非常实用的数据结构,不仅可以处理数据库,也可以处理excel、文本文档等其他存储...

悠悠然然
2017/10/30
107
0
tinyscript 1.2.0 发布了,注重集合类处理的脚本语言

tinyscript 1.2.0 发布了,tinyscript 一个注重提升集合类处理操作的脚本语言。 新增功能: [新增] 增加序表insert函数,支持lambda语法,允许数据来自别的序表 [新增] 增加序表和json互转函数...

悠悠然然
2017/11/21
834
14
TinyFramework/tinyscript

最新版本号: #tinyscript 一个注重提升集合类处理操作的脚本语言。 特点: 无缝与java结合,支持创建、调用java对象和方法。 可以与Spring结合,直接访问bean对象 语法简洁,避免用户编写复...

TinyFramework
2017/09/01
0
0
注重提升集合类处理操作的脚本语言--tinyscript

许多的人使用Java来作为主要的编程语言,许多的时候感觉代码太过繁复,当然有Scala、Kotlin、Python等等语言号称可以解决此问题,但是毕竟生态圈的切换不是个小问题。同时语法结构和Java相去...

悠悠然然
2017/09/01
545
1
如何用 ANTLR 4 实现自己的脚本语言?

ANTLR 是一个 Java 实现的词法/语法分析生成程序,目前最新版本为 4.5.2,支持 Java,C#,JavaScript 等语言,这里我们用 ANTLR 4.5.2 来实现一个自己的脚本语言。 因为某些未知原因,ANTLR...

OneAPM蓝海讯通
2016/03/29
65
0

没有更多内容

加载失败,请刷新页面

加载更多

OpenStack 简介和几种安装方式总结

OpenStack :是一个由NASA和Rackspace合作研发并发起的,以Apache许可证授权的自由软件和开放源代码项目。项目目标是提供实施简单、可大规模扩展、丰富、标准统一的云计算管理平台。OpenSta...

小海bug
昨天
6
0
DDD(五)

1、引言 之前学习了解了DDD中实体这一概念,那么接下来需要了解的就是值对象、唯一标识。值对象,值就是数字1、2、3,字符串“1”,“2”,“3”,值时对象的特征,对象是一个事物的具体描述...

MrYuZixian
昨天
6
0
数据库中间件MyCat

什么是MyCat? 查看官网的介绍是这样说的 一个彻底开源的,面向企业应用开发的大数据库集群 支持事务、ACID、可以替代MySQL的加强版数据库 一个可以视为MySQL集群的企业级数据库,用来替代昂贵...

沉浮_
昨天
7
0
解决Mac下VSCode打开zsh乱码

1.乱码问题 iTerm2终端使用Zsh,并且配置Zsh主题,该主题主题需要安装字体来支持箭头效果,在iTerm2中设置这个字体,但是VSCode里这个箭头还是显示乱码。 iTerm2展示如下: VSCode展示如下: 2...

HelloDeveloper
昨天
9
0
常用物流快递单号查询接口种类及对接方法

目前快递查询接口有两种方式可以对接,一是和顺丰、圆通、中通、天天、韵达、德邦这些快递公司一一对接接口,二是和快递鸟这样第三方集成接口一次性对接多家常用快递。第一种耗费时间长,但是...

程序的小猿
昨天
11
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部