Programming languages 像I'一样向我解释连接语言;我是一个8岁的孩子
我已经读过了,现在我比刚开始的时候更困惑了。:-)Programming languages 像I'一样向我解释连接语言;我是一个8岁的孩子,programming-languages,concatenative-language,Programming Languages,Concatenative Language,我已经读过了,现在我比刚开始的时候更困惑了。:-) 用愚蠢的人的话来说,什么是连接式语言?你无法解释一种语言,只要找到一种(,最好是)并尝试一下就可以了。教程比StackOverflow答案更好。在普通编程语言中,可以自由定义变量,并使用这些变量作为参数调用方法。这些很容易理解,但有点有限。通常,重用现有方法很困难,因为您无法将现有变量映射到方法所需的参数中,或者方法A调用另一个方法B,如果您只能将对B的调用替换为对C的调用,那么A将非常适合您 连接语言使用固定的数据结构来保存值(通常是堆栈或列
用愚蠢的人的话来说,什么是连接式语言?你无法解释一种语言,只要找到一种(,最好是)并尝试一下就可以了。教程比StackOverflow答案更好。在普通编程语言中,可以自由定义变量,并使用这些变量作为参数调用方法。这些很容易理解,但有点有限。通常,重用现有方法很困难,因为您无法将现有变量映射到方法所需的参数中,或者方法A调用另一个方法B,如果您只能将对B的调用替换为对C的调用,那么A将非常适合您 连接语言使用固定的数据结构来保存值(通常是堆栈或列表)。没有变量。这意味着许多方法和函数具有相同的“API”:它们处理其他人留在堆栈上的东西。另外,代码本身被认为是“数据”,即,编写可以修改自身或接受其他代码作为“参数”(即堆栈上的元素)的代码是常见的 这些属性使这种语言非常适合链接现有代码以创建新的内容。重用是内置的。您可以编写一个函数,该函数接受一个列表和一段代码,并为列表中的每个项目调用代码。这将适用于任何类型的数据,只要其行为类似于列表:来自数据库的结果、来自图像的一行像素、字符串中的字符等 最大的问题是你不知道发生了什么。只有两种数据类型(列表、字符串、数字),所以所有内容都映射到了这些类型。当你得到一段数据时,你通常不在乎它是什么或者它来自哪里。但这使得我们很难通过代码跟踪数据来查看数据发生了什么 我相信成功地使用这些语言需要一定的心态。它们并不适合所有人 [编辑]福思有一些渗透力,但没有那么多。您可以在任何现代激光打印机中找到PostScript。所以它们是利基语言
从功能层面来看,它们与LISP、C类语言和SQL相符合:它们都是,所以你可以计算任何东西。这只是需要编写多少代码的问题。有些东西在LISP中更简单,有些在C中更简单,有些在查询语言中更简单。除非你有一个背景,否则“更好”的问题是徒劳的。
对于你的简单问题,这里有一个主观和有争议的答案 我看了这篇文章和几个相关的网页。网页上说他们自己没有真正的理论,所以难怪人们很难给出一个准确和可理解的定义。我想说的是,目前将语言分类为“连接”或“非连接”是没有用的 对我来说,这看起来像是一个让他有机会脱帽致敬的术语,但对其他程序员来说可能没什么用处 虽然后记和其他内容值得研究,但我在Manfred von Thun的Joy编程语言中并没有看到任何非常新颖或有趣的东西。事实上,如果你读了Chris Okasaki的文章,你就可以在一个相对于Joy来说完全是主流的环境中尝试所有这些东西 所以我的答案是,没有简单的解释,因为没有成熟的理论支持连接语言的概念。(正如爱因斯坦和费曼所说,如果你不能向一名大学新生解释你的想法,你就不会真正理解。)我会进一步说,尽管学习其中一些语言,如Forth和PostScript,是对时间的极好利用,试图弄清楚人们说“连接”时的确切含义这可能是在浪费你的时间。在阅读和借鉴了我十几岁时对福思的一点记忆后,我相信串联编程的关键在于:- 根据特定数据堆栈上的值查看数据
- 函数通过在同一数据堆栈上弹出/推送值来处理内容
虽然我不认为级联语言=堆栈语言,正如作者在上面指出的那样,但它似乎类似。我认为主要思想是1。我们只需将其他程序合并在一起,就可以创建新的程序 还有,2。程序的任何随机块都是有效的函数(或子程序) 好的旧的纯RPN Forth具有这些特性,不包括
int foo(int a, int b)
{
return a + b;
}
var c = 4;
var d = 3;
var g = foo(c,d);
push 4
push 3
+
pop
( Forth code )
: fib
dup 2 <= if
drop 1
else
dup 1 - recurse
swap 2 - recurse +
then ;
( Forth code )
: 1 1 ; \ define a function 1 to push the literal number 1 on stack
a b c
(c a b)
(c (b a))
(c (b (a)))
( Forth code )
: <- execute ; \ apply function
a b c <- \ Lisp: (c a b)
a b <- c <- \ Lisp: (c (b a))
a <- b <- c <- \ Lisp: (c (b (a)))