虽然LISP有一些我见过的最简单的语法,但我仍然对基础知识感到困惑.我做过研究,我得出的结论是有两种数据类型:"atoms"和list.然而,我也遇到过"S-expression"这个术语,它似乎描述了原子和列表.那么,S-expression究竟是什么?它是一种数据类型吗?另外,我不确定如何区分LISP中的数据列表中的函数调用.例如,(1 2 3)是列表,而(f 2 3)可以是某个函数.但我怎么知道f是函数名还是某种数据类型?由于列表和函数使用相同的语法,我不知道如何区分这两者.最后,最重要的是,我需要一个心理模型来思考LISP的工作原理.例如,什么是基本数据类型?用于处理基本数据类型的内置过程有哪些?我们怎样才能看到数据和程序不同?例如,在Java中,类顶部的实例变量用于表示数据,而方法是操作数据的过程.这在LISP中看起来像什么?
(I'm new, so I'm not sure if this question is too broad or not)
我是LispBook和Practical Common Lisp的推荐.两本好书.一旦你理解了基础知识,我真的,真的推荐Paul Graham的"On Lisp".
引导您获得有关特定问题的答案:
数据类型:Lisp有一组丰富的数据类型(数字类型,如整数,有理数,浮点字符和字符串 - 数组和散列表 - 还有更多),但在我看来,假设你已经习惯了整数和字符串,你应该从阅读symbol和开始cons.
symbol:意识到符号既是标识符又是值.了解每个符号可以"指向"一个数据值,同时"指向"一个函数(还有三个其他属性,您不必担心)
cons:发现这个神奇的东西叫做'cons cell'只是一个有两个指针的结构.一个称为"登记册的地址部分",另一个称为"登记册的减少部分".不要担心这些名称的含义(它们不再相关),只要知道该car函数返回Register的Address部分的内容,并cdr返回Decrement部分.现在忘记所有这一切,只记得现代Lispers将cons单元视为带有两个指针的结构,一个叫做汽车,另一个称为cdr.
名单:"没有勺子." 也没有列表.意识到我们所认为的列表只不过是一组缺点单元格,每个缺点的汽车指向列表中的一个成员,每个缺点的cdr指向下一个缺点(除了最后的缺点) ,其cdr是"空指针"nil).这对于理解列表操作,嵌套列表,树结构等至关重要.
原子:现在,将原子视为数字,字符,字符串或符号.这足以让您入门,您可以稍后深入了解细节.
S表达式:s-expr定义为"指向两个s表达式的原子或cons单元".暂时不要担心s-expr是什么或不是s-expr,但是请查看维基百科的简要介绍
列表与功能调用:伙计,哦,伙计!我开始的时候就挣扎着这个!但通过一些练习实际上很容易:"五次两次"只是一个英语短语,对吧?但如果我要求你"评价"它,你可能会说"十"."1 + 2"是一个数学表达式,但是数学家会将它评估为3."5"只是一个数字,但如果你输入计算器并按"=",计算器会将其评估为答案5在Lisp (+ 1 2)中只是一个列表.它是一个包含符号+,数字1和数字2 的列表.但是 - 如果你要求Lisp评估该列表,它将调用该函数+,将其作为参数传递1和2.很大程度上对Lisp感到满意的是学习评估s表达式的时间和地点,以及它们不在何处.现在 - 将评估您在REPL中输入的任何内容,将评估函数调用的参数,可能不会评估宏调用的参数,您可以使用它们quote来防止评估.通过练习,这将变得更容易.
基本功能:虽然我所说的"名单"是不存在的("它conses之外一路下跌,Fry先生"),先学会了基于列表的东西,car,cdr,cons,list,append,reverse和应用性的东西mapcar,mapcons,apply.这是开始思考列表和函数式编程的好方法.
类,成员数据和方法:我建议稍后保留面向对象.首先学习Lisp的基础知识.在您成为语言本身的朋友之前,要担心担心数据封装,访问控制和多态性.当你准备好了,阅读"On Lisp",第25章将引导你自己向Lisp添加面向对象,展示Lisp如何真正成为可编程编程语言.本书将向您介绍CLOS,这是Common Lisp中内置的标准面向对象系统.了解CLOS,但肯定会浏览其他OO库.Lisp是我知道的唯一语言,你实际上可以选择如何你想要的语言来实现面向对象.
我要到此为止.对上面的前8个概念感到满意,强大的心理模型将自行解决.
| 归档时间: |
|
| 查看次数: |
840 次 |
| 最近记录: |