`
mycream
  • 浏览: 55306 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

Lisp 语言学习--if 语句有问题

阅读更多
为了方便的开发学习,还是回到了 Linux 平台下。毕竟这里安装些古董语言比较方便,怎么说也是类 Unix 系统上发展而来的嘛。第二天了,却仍在为 Lisp 语法奔波。手头上中文资料有限,又要考虑其他,这个进度还是忍受一下吧。好啦,不牢骚啦。下面是我的第一个 Lisp 程序:汉诺塔

(setq a "a")
(setq b "b")
(setq c "c")

(defun move (n x y z)
  (if (> n 0)
    ((move (- n 1) x z y)
     (princ "->")
     (move (- n 1) y x z))))

(defun hanota (n)
  (move n a b c))


可惜这段代码始终通不过编译,总得到如下提示:

*** - SYSTEM::%EXPAND-FORM: (MOVE (- N 1) X Z Y) should be a lambda expression

郁闷了一整天,找了许多的资料,最后得到这一句

COMMON LISP: A Gentle Introduction to Symbolic Computation 写道
IF is the simplest Lisp conditional. Conditionals are always macros or special functions,* so their arguments do not get evaluated automatically.


macros or special functions! 不明白为什么 if 后添加的必须是 macros or special functions(宏或特殊函数)。但这样就是说把 if 的候选区换成函数就能正常运行了。于是试用下面的代码:

(setq a "a")
(setq b "b")
(setq c "c")

(defun move (n x y z)
  (if (> n 0)
    (move-operation n x y z)
    t
  )
)

(defun move-operation (n x y z)
  (move (- n 1) x z y)
  (princ x)
  (princ "->")
  (princ z)
  (princ "  ")
  (move (- n 1) y x z))

(defun hanota (n)
  (move n a b c))

新建了一个 move-operation 函数,编译通过。OK, 测试:

> (hanota 3)
a->c  a->b  c->b  a->c  b->a  b->c  a->c  
T

成功。

表面的问题是解决了,可这不是最终解决方案。marco or special functions 还不完全理解是什么。if 还有什么潜规则不清楚。princ 的回车换行也没找到。所以,这个初成品,只能是现在的一种简易替换方法吧。

分享到:
评论
1 楼 xiao2004 2011-01-02  
定义一个progn就完了。
    
(defun move (n x y z) 
  (if (> n 0) 
     (progn (move (- n 1) x z y) 
      (princ "->") 
      (move (- n 1) y x z))))

相关推荐

    lisp语言陈光喜2005

    通过对这些知识点的学习,读者能够对Lisp语言有一个全面的认识,并能够掌握其基础语法和编程技巧。Lisp虽然看似简单,但其实内涵丰富,对于想要深入了解函数式编程的人来说,是一门值得学习的语言。

    lisp代码-write-line 输出语句

    在LISP(Lisp,全称List Processor)编程语言中,`write-line`函数是一个用于输出文本到标准输出设备(通常是显示器)的关键组件。本文将深入探讨`write-line`的功能、用法以及它在LISP代码中的作用。 `write-line`...

    Lisp语言.陈光喜.2005.pdf

    本书旨在帮助读者从零基础开始学习并掌握Lisp语言,涵盖从基本概念到高级应用的多个方面。接下来,我们将详细解读并总结书中的关键知识点。 ### Lisp概述 Lisp是一种历史悠久且功能强大的编程语言,以其独特的前缀...

    autolisp语言课件

    AutoLISP是一种专门为AutoCAD平台设计的编程语言,它结合了人工智能语言LISP的基本特性以及AutoCAD的强大图形处理能力。...对于想要深入学习AutoCAD自动化的人员来说,理解和掌握AutoLISP语言是必不可少的一步。

    AutoLISP 编程.zip_autoLisp编程_autolisp_autolisp教程_lisp编程

    AutoLISP是一种基于LISP语言的编程环境,专为Autodesk的AutoCAD软件设计,用于扩展AutoCAD的功能和自定义工作流程。这个压缩包文件包含了关于AutoLISP编程的教程,对于想要掌握这一技能的用户来说是宝贵的资源。 在...

    AutoLISP应用程序源代码.pdf

    4. 条件语句:AutoLISP 提供了多种条件语句,例如 if 语句、while 语句等。例如,(if (setq wwjm1 (open wnewacad "w")) ...) 用来判断是否成功打开 wnewacad 文件,如果成功则执行后续操作。 5. 函数定义:Auto...

    Lisp的学习教程(chm格式)

    2. **AutoLISP语法**:如DEFUN函数定义、IF条件语句、DO循环、PROG过程定义等,以及与AutoCAD交互的特殊函数。 3. **VLA(Visual LISP Application Programming Interface)**:介绍如何利用VLA与AutoCAD内部对象...

    AutoLISP-应用程序源代码.pdf

    * `if`语句用于实现条件判断。 * `progn`语句用于实现多个语句的组合执行。 这些特性是AutoLISP编程语言的基本组成部分。 与AutoCAD集成 代码中还包括了与AutoCAD软件的集成,例如: * `acadmnlpath`变量用于...

    学习用项目,用 Python 实现一个仿 lisp 语言的解释器.zip

    在本项目中,我们将深入探讨如何使用...同时,理解Lisp语言的特性也有助于提升对其他编程语言的理解和设计思维。在实践中,你可以逐步完善这个解释器,使其支持更多Lisp的高级特性,例如动态类型、多态、元编程等。

    AutoLISP函数参考手册-cad2008.rar_autolisp_lisp参考手册

    函数是执行特定任务的代码块,而特殊形式是LISP语言特有的结构,如`defun`用于定义函数,`if`用于条件判断。 2. **数据类型**:AutoLISP支持多种数据类型,包括数字(整数和浮点数)、字符串、符号、列表和向量。...

    AutoLISP函数参考手册-cad2008.rar

    AutoLISP是AutoCAD软件内置的一种编程语言,主要用于扩展AutoCAD的功能和自定义工作环境。在AutoLISP中,程序员可以编写一系列函数和程序来控制AutoCAD,使其能执行更复杂的几何绘制、数据处理和自动化任务。《Auto...

    AutoLISP Reference - Visual LISP, AutoLISP & DXF

    - **if**:条件语句。 - **initdia**、**initget**:初始化对话框或获取。 #### 总结 AutoLISP是一种功能强大的脚本语言,它使开发者能够轻松地访问AutoCAD的功能并创建定制化应用程序。通过掌握上述列出的操作符和...

    common-lisp-by-example:通过示例常见Lisp的回购

    **Common Lisp 语言详解** Common Lisp 是一种强大的、高级的编程语言,以其强大的函数式编程特性、宏系统和动态类型...无论你是 Lisp 新手还是有经验的开发者,都可以从中受益匪浅,深入理解这一强大编程语言的魅力。

    LISP语言[参考].pdf

    LISP语言的设计理念源自数学,这使得它在概念上超越了其诞生年代的技术,甚至对现代编程语言仍有深远影响。 LISP的独特之处在于它的九项创新思维,这些思想在当时是革命性的,部分已成为现代编程语言的标准特性: ...

    lisp代码-write 输出语句

    在LISP(Lisp,List Processing)编程语言中,`write`函数是用于输出表达式值的基本工具之一。它允许程序员将数据结构转化为字符形式,并显示在标准输出设备上,通常为...理解其工作原理和用法对掌握LISP语言至关重要。

    lisp 软件教程

    - **条件语句**: `IF` 用于条件判断。 - **迭代**: `DOTIMES` 和 `DO` 用于循环。 - **递归**: LISP鼓励使用递归来解决问题。 - **Lambda表达式**: 创建匿名函数,用于函数式编程。 ### 5. 高级LISP特性 - **宏**:...

    lisp:我的旧的Lisp实现---有关最新的和维护的实现,请参见funlisp

    我已经实现了lambda函数和函数调用,基本的整数算术,简单的列表操作,if语句,甚至还建立了基本的垃圾收集系统(通过引用计数)。 试用起来很容易(见下文)。 运行! 如果您具有Unix-y开发环境,则应该很容易...

    常用LISP

    #### 一、LISP语言简介 LISP(LISt Processing language)是一种历史悠久的编程语言,由John McCarthy于1958年设计。它是最早的高级编程语言之一,并且对人工智能领域的研究和发展产生了深远的影响。LISP的主要...

Global site tag (gtag.js) - Google Analytics