技术开发 频道

50岁的Lisp语言缘何如此先进

  Perl 5的写法则是:

sub foo {
    my($n)
= @_;
    
sub {$n += shift}
  }

  这比Lisp和Ruby的版本,有更多的语法元素,因为在Perl语言中,你不得不手工提取参数。

  Smalltalk的写法稍微比Lisp和Ruby的长一点:

foo: n
    |s|
    s :
= n.
    
^[:i| s := s+i. ]

  因为在Smalltalk中,局部变量(lexical variable)是有效的,但是你无法给一个参数赋值,因此不得不设置了一个新变量,接受累加后的值。

  Javascript的写法也比Lisp和Ruby稍微长一点,因为Javascript依然区分语句和表达式,所以你需要明确指定return语句,来返回一个值:

function foo (n){
    return
function (i){
      return n
+= i }}

  (实事求是地说,Perl也保留了语句和表达式的区别,但是使用了典型的Perl方式处理,使你可以省略return。)

  如果想把Lisp/Ruby/Perl/Smalltalk/Javascript的版本改成Python,你会遇到一些限制。因为Python并不完全支持局部变量,你不得不创造一种数据结构,来接受n的值。而且尽管Python确实支持函数数据类型,但是没有一种字面量的表示方式(literal representation)可以生成函数(除非函数体只有一个表达式),所以你需要创造一个命名函数,把它返回。最后的写法如下:

 def foo (n):
    s
= [n]
    def bar (i):
      s[
0] += i
      return s[
0]
    return bar
0
相关文章