/*本文中所有代码未经编译,若有错误,欢迎指正*/
首先感谢来自清华大学的牟瞳指出上一篇文章中的疏漏:
BrainFk中']'的作用应当是在*p不为零时跳转到前一个(而非后一个)'['之后。
BrainFK中','的作用是逗号是从终端输入ASCII到指针所指地址。
前一篇文章里我们提到了关于如何使用BrainFK实现动态定位指针的问题,就有人问,为何会对这样一门晦涩的语言产生兴趣
当初接触BrainFK完全是抱着拾趣的态度,然而当我读懂了一些BrainFK代码之后,我突然强烈的感觉到,BrainFK这种极小化的语言,是有着自身优势所在的
这种想法并未获得广泛的认可,而对于BrainFk语言较为深入的探讨也更是寥寥无几。
昨天和小光探讨了一些关于BrainFK语言实际应用方面的问题,在探讨的过程中,我们达成了一个共识:
在适当的使用下,BrainFK是一种简洁、方便、灵活、高效的语言。
这是我所得到的第一种对于BrainFK明确认可的态度
我对嵌入式开发并不很了解,不敢斗胆对小光提出的将BrainFK应用于单片机开发的想法作出评论。
所以我们的讨论范围依旧围绕PC程序的开发。如果读者里面有精通嵌入式的,欢迎前来讨论。
不,我并不是说单纯的使用BrainFK开发应用程序,那种事情只有闲的DT的人才会去做。
我的意思是,配合经过改进的BrainFK,进行高效的敏捷开发。
下面我们就来谈谈对于BrainFK便捷性和可读性的改进:
首先我们看一个例子,用BrainFK输出"Brain FK\n"的代码为:
+++ +++ +++ + [
> +++ +++ +
> +++ +++ +++ +
> +++
> +
<<<< -
]
> -----
>> ---
>>> ++
<<<
+.- > +++++++++++++++++.-----------------.++++++++.+++++.-------------
> .
<<
+++++.+++++.----------
>>>.
<<<<
在这里,我们发现,所有的操作符都经过了大量的复用,浪费时间并降低了可读性。
于是我们引入一个操作计数器的概念,这个概念的灵感来源于vim。
用过vim的人都知道,vim中大多数命令是可以前置计数器的,比如 9af 将在光标后置入9个'f'
同样地,我们将这一概念引入BrainFK,不过为了阅读习惯考虑,我们将计数器后置,那么输出"Brain FK\n"的代码为:
> +65
> +97
> +32
> +10
<<< + . -
> +17 . -17 . +8 . +5 . -13
> .
<< +5 . +5 . -10
>>> .
<4
这样就大大的缩短了代码的长度,而且增加了灵活性,比如你可以使用+10[>++++<-]++来完成*[1]+42
我们发现,由于'.'的大小关系,这个符号非常影响排版,于是我斗胆作出如下更改:
使用'!'代替'.'
'?'代替','
那么代码变为:
> +65
> +97
> +32
> +10
<<< +! -
> +17! -17! +8! +5! -13 >!
<< +5! +5! -10 >>>!
<4
但是这样的语言依旧不适合开发,昨晚想了一下,要让BrainFK变得实用,她必须作为配角存在,也就是说,她将成为一个辅助工具
我们将这个工具命名为EBRAINFUCK,全称为"Externed brainFK recalling anchor in note for uneasy C Kicking"
这个工具引入了一个C/C++函数
brainfk(<type>*bfpointer, string bfcode)
于是我们可以将BrainFK代码嵌入到C/C++中。
当然如果你足够NB还可以写cBrainFK类,可以实现多个BrainFK对象互相计算神马的~
作为示例,我们举一个最最简单的例子:
我们要写一个非常简单的古典加密算法,将字符串str中所有字符的ASCII加三(A变成C,B变成D,等等),然后倒叙输出
那么我们可以调用如下函数
brainfk(str, "
[>+3] < [
!
<
]
");
在C++中,'!'可看作“加入到outstream”
转换大写为小写的算法更加简单:
brainfk(str,"[>+32]");
对于cBrainFK类,我们可以写下面的二叉树查找算法:
XXXXXXXXXXXarch(varToSearch,BSTree,"[[[!>]<>2]<<<]");
这里'!'表示将*bfpointer的值传递给XXXXXXXXXXXarch(),与其中的varToSearch进行比较。
至此,我们看到,EBrainFK辅助编写的代码简洁、精致,又不失可读性,如果该库写得好的话,执行也会非常高效。
以上便是对于BrainFk语言实际应用中可行性探讨的上半部分,下半部分中,我们将进行更加深入的探讨。
200字以内,仅用于支线交流,主线讨论请采用回复功能。