我的shell会算矩阵,你的呢

2018 年 3 月 16 日

实现:

我今天知道有个函数名叫command_not_found_handle于是写了下面代码

 

lean and mean

2017 年 6 月 26 日

 

嵌入CRuby脚本引擎的一个历史遗留问题和解决方案

2017 年 2 月 27 日

最近又需要嵌入CRuby,又遇到了这个问题,

主要是当使用net/http等socket相关的库时,会提示找不到read_nonblock方法。

这个问题的解决方案很简单,补充一个定义即可

但是使用ruby或者irb时就没有这个问题,为什么呢

(这也不是操作系统相关的问题,虽然我用的是windows)

irb下通过IO.instance_method(:read_nonblock).source_location可以发现这个方法的定义在一个叫”<internal:prelude>”的文件中定义,显然是内部自己的奇怪操作。

这个定义可以通过ruby_init_options函数来初始化,然而。

然而经过搜索发现这个函数一直有人提出,将它导出作为feature,结果从1.9到2.4都没有实行,这个函数直到现在,现成编译的版本从未导出符号。

所以,现在初始化ruby解释器,如果不想从源码修改去掉函数的static存储类关键字这里开始,一个比较合适的写法是:

 

 

一种简单啰嗦的强行point-free的方法

2016 年 8 月 10 日

最近做codewars上的Haskell的水题的时候(难题我也不会),基本上是尽量用一种point-free的风格(https://en.wikipedia.org/wiki/Tacit_programming)去写的。我个人理解也就是函数的实现不写出参数,只通过curry和组合等来实现,例如:

另外这里也不认可出现用lambda形式代入参数如:

这里用一个生成的方法来实现一个比较通用的方案,其实应该也可以用haskell的point-free风格代码来实现这套代码而不是生成,这里用Ruby生成。

注意到:

也可以写成

每次多一个参数就会是最里面多一个

等等的结构,也就是组合前面是一个(a .)的形式

 

另外,如果我们把tuple视为栈

于是这样就可以实现一组DSL(https://github.com/Artoria/pf-builder)了,比如海伦公式的实现

heron a b c = let s = (a + b + c) / 2 in s * (s – a) * (s – b) * (s – c)

下面的思路是通过build生成函数体

首先把三个参数a b c转成[c, b, a]

然后应用 (/2) . sum得到s

然后把s变成(s-), map到[c, b, a]上,变成[s-c, s-b, s-a], 然后对他它用product, 并且乘上这个积和s

就是结果

得到的结果,反正就是不能看了:

另外,因为point-free的函数也是函数,可以嵌套

比如fib n = foldr (\_ (x, y) -> (y, x+y)) (1, 0) [1..n]

得到的结果

 

 

简单的Ruby直接到机器码的生成器(X86) RPGMaker兼容

2016 年 5 月 7 日

毕竟Bellard大牛的OTCC里面就是到处飞机器码,并且,他是一边解析词法符号一边就直接产生了,真是棒棒的不按套路却又无比正经的写法

 

Seiran API v1.7 beta 0.04 for RGSS

2014 年 2 月 19 日

一种新的调用API的包装,因为API不包装也可以调用,其实就是自己的脚本综合练习一类的东西吧:

用法:

鼠标指针:

 

自定义结构体的鼠标指针:

 

 

 

BMVC for RGSS 1.00

2014 年 2 月 4 日

1. BMVC是什么?

BMVC是RGSS中实现多个窗口或者精灵,或者他们的混合架构的一个脚本,可以用来简化代码。
相对于单个的窗体Window/精灵Sprite而言,BMVC可以同时有多个显示对象被控制。比如应用物品时,物品描述窗口,物品选择窗口和对象选择窗口是三个窗口,但有关联。可以用BMVC实现。
而相对于场景Scene而言,BMVC比Scene要轻量,也可以嵌入Scene中。
所以也可以放在事件中,比如一个物品选择窗口,没必要创建一个类。

BMVC是RGSS系列上对MVC模式(http://zh.wikipedia.org/wiki/MVC)的一个特化实现,因为RGSS默认脚本本身已经实现一系列与模型有关的东西比如$game_…,这里只需要和他们建立各种关系即可,这种关系模型在本脚本叫做BindingModel,故本脚本命名为BindingModel-View-Controller

2. 如何使用?

有两个重要的方法,一个是K,一个是B,K创建视图和有关的控制器,B创建和模型的绑定。

写在K里面的self.xxx,如果他是一个window或者sprite的话,会自动update和dispose

 

第一个例子,显示一个有Hello world的窗口,按回车(Input::C)时退出,因为不含任何可变的数据,所以没有用到B。

 

下面这个例子的窗口将要显示一个全局变量$a,并且当你按下回车键时,$a会加上1,并且显示也对应变化,注意变化的部分用B{}括起来。相对于上面那个例子,实际上就是把不变的”Hello world”换成了变化的$a.to_s,这里我们用B{$a.to_s}括起来。(同时加上了contents.clear清除内容这样的行为,不然前后写的文字会重叠在一起)

 

因为按下回车键时,$a加上了1,所以$a.to_s会变化,B{$a.to_s}会把这个变化反馈给外面那个B{},

因此重新进行了绘制.

 

实现:

 

手抽去重发明两个boost的轮子

2014 年 1 月 18 日

调的心情郁闷了
http://codepad.org/2lep9EjC
http://codepad.org/ChE9zOgB

用Windows批处理做网站

2014 年 1 月 7 日

其实在上古时代也没有php啦asp这些神器。。有perl或者甚至C语言来做服务器网页就已经很不错了。。。这里的本质是通过执行这些程序,输出的文本,当做HTTP内容返回。如果你看见有些老网站的地址中有/cgi-bin/,那基本上就是了。

这里兰兰用的是WAMP,windows下的一个一键快捷安装的个人服务器套件。如果你没有修改他的设置,比如装在C:\WAMP,那么这个目录应该是C:\WAMP\cgi-bin,新建一个hello.cmd,输入下面的代码:然后访问http://localhost/cgi-bin/hello.cmd?name=Hello&var=3就可以看到结果。不过这个代码的最后一行set %b:~1,-1%和中间某行call :parse_uri “%QUERY_STRING%”实际上可以被注入代码,因此用于生产环境是很不安全的,这里仅仅是用来卖萌(demostration)。

 

 

 

【原创】论另一种把Ruby翻译成其他语言的思路(不需要AST相关)

2013 年 6 月 3 日

转载本文在您同意接受CC协议(NC-ND)情况下进行,可以参考:

http://creativecommons.org/licenses/by-nc-nd/3.0/

1. 目的。

给一个Ruby程序,把他翻译成语义上等价的其他程序。下面全部以C++为例,且不需要处理AST。 read more

← Previous Page