程序设计语言概论课程相关杂记

笔记都记在笔记本上了,这边记点side-story一般的杂记吧。

到计算机系去旁听了马晓星老师上的程序设计语言概论。周二的第一次课的时候还不知道有这课所以没去。周五(2008-02-22)去跟了第二次课。

接下来准备要讲到Scheme了。到http://www.scheme.com抓了Petite Chez Scheme 7.4的档。

—————————————————————–

不知道有多少人关注过Euphoria这种语言。与许多脚本语言一样,它是一种very-high-level语言。不过它宣称自己非常简单而且非常快——官网上的资料称它的先进的解释器比传统的Python和Perl的解释器快30倍。速度就罢了,发展到某个阶段之后大家都会说自己很快的……

它更重要的一个特点应该是它最主要的数据结构,sequence。字串在Euphoria中不过是sequence的语法糖。Sequence本质上是一种线性的异质容器,可以通过下标来访问其中的元素;元素可以是atom或者sequence。下标只能作用于变量(而不能作用于表达式,于是date()[2]这种写法就不行)。

还没仔细看,不过乍一看这sequence跟Lisp里的list看起来好像。于是给我一种直观的感觉,Euphoria就像是命令式的Lisp一般;不过Euphoria貌似没S-expression用。接下来看Scheme相关的时候也顺带一起看看Euphoria来对比吧。

Euphoria中“类型”的意味与其它语言很不一样。由于atom只是数值,则由atom而构成的sequence以及包含有sequence的sequence到最后都肯定是数值。结果user-defined type就变成了数值范围的检查……

type hour(integer x)
    return x >= 0 and x <= 23
end type

hour h1, h2

h1 = 10      -- ok
h2 = 25      -- error! program aborts with a message

Euphoria支持结构化程序设计语言的三种经典结构:顺序,分支,循环。

常见的语法结构都在,if-then-else、for、while等。

Euphoria例子:(来自官方文档

sequence list, sorted_list

function merge_sort(sequence x)
-- put x into ascending order using a recursive merge sort
    integer n, mid
    sequence merged, a, b

    n = length(x)
    if n = 0 or n = 1 then
        return x  -- trivial case
    end if

    mid = floor(n/2)
    a = merge_sort(x[1..mid])       -- sort first half of x
    b = merge_sort(x[mid+1..n])     -- sort second half of x

    -- merge the two sorted halves into one
    merged = {}
    while length(a) > 0 and length(b) > 0 do
        if compare(a[1], b[1]) < 0 then
            merged = append(merged, a[1])
            a = a[2..length(a)]
        else
            merged = append(merged, b[1])
            b = b[2..length(b)]
        end if
    end while
    return merged & a & b  -- merged data plus leftovers
end function

procedure print_sorted_list()
-- generate sorted_list from list
    list = {9, 10, 3, 1, 4, 5, 8, 7, 6, 2}
    sorted_list = merge_sort(list)
      sorted_list
end procedure

print_sorted_list()     -- this command starts the program

注意:(2008-02-22)今天老师上课的时候提到了C-like语言里使用花括号来表示代码块的特征。这种语言设计有一个*不太好*的地方,那就是无论是什么语句块都同样以“}”结束,很容易让人对错括号。所以会有在“}”之后标注语句块类型的注释习惯,例如:

while ( !done ) {
    switch ( code ) {
    case OP_ADD:
        if ( otherCond ) {
            // ...
        } else {
            // ...
        } // if-else
        break;
    // ...
    default:
        // ...
        break;
    } // switch
} // while

要从语言级别根除这个问题,最直观的方式就是“强制”在块的结尾标明语句块的类型。于是很自然的就演变成了类似“end function”“end if”的形式。

习惯真是魔鬼。之前很长一段时间都没办法从C-like语法的惯性中摆脱出来。直觉上不喜欢Pascal也是因为它不是curly-brace系的语言。呵呵,真糟糕。

—————————————————————–

(2008-02-24 16:30)刚才在看Channel 9上的Lang.NET 2008相关报道。其中一篇,[url=Dan Ingalls and Allen Wirfs-Brock: On Smalltalk, Lively Kernel, Javascript and Programming the Internet]http://channel9.msdn.com/Showpost.aspx postid=380959[/url],Dan在讲到JavaScript时提到了对“clean language”的看法,说如果一种语言提供了太多冗余的构造去做同一件事,那么它就不够“clean”。我对这种说法的理解还是不够充分。如果说JavaScript加入了class支持而不抛弃prototype-based的设计,那或许是很冗余,但现在的ECMAScript 3应该还算干净吧(但一点也不“简单”)。

想想看,通过closure来模拟对象,这也是一种强大的能力。当需要一个只有一个公共方法,而又需要保持内部状态的对象时,直接定义一个函数去返回一个内部嵌套的函数,让后者所持有的闭包去保持状态就行。Consise, no 

—————————————————————–

(2008-02-28 23:00)突然在想,编程语言最大程度的灵活度莫非就是意味着无类型么。

任何数据结构都可以用表(list)来模拟。记录(record)或者结构(struct)都可以被表模拟。很多不支持记录/结构的语言都会建议使用数组来模拟这类语言构造,而这时候的“数组”也就是一个list。Lisp系的语言依靠表而获得了强大的语言能力(当然更重要的是表的应用方式——S-expression),上面的Euphoria看来也是如此。

不过,一种语言中对表的操作要是只支持CAR/CDR/CONS,而没有下标索引的话,感觉还是稍微缺点什么?

假如索引不限定使用非负整数,而是可以使用任意类型的数据(例如字符串)的话,那不就是泛型的关联数组了么?让我想到ECMAScript……

胡思乱想而已,总之先记下来。

—————————————————————–

最近动态语言越来越热门,其中有不少都支持3个C的language constructs:closure、coroutine、continuation。闭包(closure)只在遵循lexical scoping的语言中出现,与嵌套作用域相关。coroutine与continuation都与“保留当前运行状态”相关;前者是说函数能保留自身的执行状态,并能将控制交给(yield)别的函数;后者是说系统能保存当前的执行状态(也就意味着要保存整个运行时stack),并在以后的某个时候能够恢复到先前保存过的某个状态继续执行。(以上描述纯粹是我现在对这3个C的理解,未必正确)。

—————————————————————–

根据worse-is-better原理,我一直喜欢的一些feature看来不少都是”worse”的一类呢。诶,原本对ECMAScript 4那么热衷的我,最近越来越觉得它kitchen-sink得太过头了。正所谓“核心概念”太多,使得语言肿胀……

JavaScript书

权威指南

《javascript高级程序设计》

另外:

我认为前端开发提升必看的两本书:

第一本是《ppk谈javascript》淘宝UED团队翻译…

这本书设计javascript浏览器兼容性等内容

第二本是《pro javascript tenniques》中文版作者是jquery库的作者john

其中文版是《精通javascript》陈贤安译

http://download.chinaitlab.com/special/javadownload.htm

纯CSSLightbox效果webjx.com

<!DOCTYPE html PUBLIC “-//W3C//DTD HTML 4.01 Transitional//EN”>
<html>
    <head>
        <title>纯CSS Lightbox效果webjx.com</title>
        <style>
        .black_overlay{
            display: none;
            position: absolute;
            top: 0%;
            left: 0%;
            width: 100%;
            height: 100%;
            background-color: black;
            z-index:1001;
            -moz-opacity: 0.8;
            opacity:.80;
            filter: alpha(opacity=80);
        }
        .white_content {
            display: none;
            position: absolute;
            top: 25%;
            left: 25%;
            width: 50%;
            height: 50%;
            padding: 16px;
            border: 16px solid orange;
            background-color: white;
            z-index:1002;
            overflow: auto;
        }
    </style>
    </head>
    <body>
        <p>This is the main content. To display a lightbox click <a href = “javascript:void(0)” onclick = “document.getElementById(‘light’).style.display=’block’;document.getElementById(‘fade’).style.display=’block'”>here</a></p>
        <div id=”light” class=”white_content”>This is the lightbox content. <a href = “javascript:void(0)” onclick = “document.getElementById(‘light’).style.display=’none’;document.getElementById(‘fade’).style.display=’none'”>Close</a></div>
        <div id=”fade” class=”black_overlay”></div>
    </body>
</html>