coffee-js / languages

编程语言学习论坛
https://github.com/coffee-js/languages/issues
112 stars 11 forks source link

编程语言能不能有句子结构? #45

Open tiye opened 11 years ago

tiye commented 11 years ago

看过上下文无关文法想起以前一个问题, 编程语言变量类型是否可以成为语法? 首先, 我不喜欢用很多符号构成语法, 因为我们习惯了大量文字少量标点的语言

单说句子结构, 对于 Lisp 系语言, 括号中第一个元素当作函数, 其余参数, 很简单 Lisp 的 (define x 1) 看起来很顺, OOP 的 man.read(words) 类似"主谓宾"的结构 只是通常不进行类型检查, 并且编程语言的类型和自然语言的类型还是不同的 参数的类型检查, 出现在静态语言里, 其意义也只在生成编译结果, 和语义无关

我在想, man.read(words) 例子中, 规定语法的是符号, 而不是 man read words 最初我的想法是, 去掉符号, 把若干变量放在一起, 语句是否能正确地执行?

比如这样定义 man read words 里三个变量的内容

new Man lilei
new String words "say something"
define (Man x) read (String y)
  x.print(y)

那么 lilei read words 就会被检测到类型, 并执行

lilei.print("say somthing")

然后跟上边的定义, 加上一个处理字符串的函数:

define angrily (String a)
  a ++ "!!"

接下来 lilei read angtily words 就被类型识别而执行:

lilei.print("say somthing" ++ "!!")
lilei.print("say somthing!!")

到此为止, 第一个存在的漏洞一个是定义仍然需要符号, 我想当语言本身被设计好, 这是可以避免的, 就像缩进之于花括号 另一个是括号依然存在, 这个问题取决于对符号容忍的程度 换成 define...as... 这样的定义如果能接受, 问题也就不大:

define x read y as Man $ String
  x.print(y)

还有个问题是用 new 生成的 Man, 含义是什么, 如何定义? 我想过用对象作为表达式的头部, 后边用方法和参数的古怪方案,

(object mathod para1 para2 para3)

按一般思路, Man 作为对象, 自带一些方法比如 print print 的定义可以当作对象的一个方法:

create Man
  define print first rest as $ String String...
    echo(first ++ rest)
  define name "man"

于是调用时用 lilei print "say something" 就好了 这样, 编程语言或许可以让类型承担更为重要的功能 想了之后, 我没有想到如何实现, 以及是否真的有实用的价值 在运行过程检查类型并确定执行顺序应该是一件效率低下的事 不确定是不是能玩的点子..

函数式语言, OO 语言, 有趣是因为有足够简单的思路, 因而能灵活 规定这样的语法之后, 我担心定义数据不会那么方便了..

Liutos commented 11 years ago

个人感觉可以,貌似就是宏而已,只是样子看起来不一样,实际上还是对代码做分析得到的代码生成或者变换,只是写法不同。