首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

为什么LISP defun在参数参数之前不需要引用?

LISP(LISt Processing)是一种函数式编程语言,其特点之一是在定义函数时,参数列表不需要显式地引用。这是因为LISP采用了一种特殊的求值策略,即“先求值再应用”的原则。

在LISP中,函数定义使用defun关键字,其语法形式为:

代码语言:txt
复制
(defun function-name (parameter-list)
  body)

在这个语法中,parameter-list是函数的参数列表,而body是函数的执行体。LISP在执行函数时,会先对参数列表进行求值,然后将求值结果应用到函数体中。

由于LISP的求值策略,参数在传递给函数之前会被自动求值。这意味着在函数体内部,可以直接使用参数的值,而不需要显式地引用参数。这种设计简化了函数的定义和使用,使得LISP代码更加简洁和易读。

举个例子,假设我们要定义一个加法函数add,它接受两个参数并返回它们的和。在LISP中,可以这样定义:

代码语言:txt
复制
(defun add (a b)
  (+ a b))

在这个例子中,参数ab在函数体内部可以直接使用,无需引用。当我们调用add函数时,LISP会自动对传入的参数进行求值,并将求值结果应用到函数体中。

总结一下,LISP的defun在参数列表之前不需要引用是因为LISP采用了一种特殊的求值策略,参数在传递给函数之前会被自动求值。这种设计简化了函数的定义和使用,使得LISP代码更加简洁和易读。

腾讯云相关产品和产品介绍链接地址:

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

  • GNU emacs Lisp小结3

    chapter4 与缓冲区有关的函数 4.1 查找更多的信息 C-h f 函数名   ;查询函数 C-h v 变量名   ;查询变量 find-tags 函数 ;跳到响应函数 M-. 函数名     ;同上 上面函数需要定义一个标记表(tags table),这是一个名为"TAGS"的文件。 可以使用M-x visit-tages-table来指定 C-h p 命令让你用主题关键字搜索Emacs Lisp标准库。 4.2 简化的beginning-of-buffer函数定义 beginning-of-buffer => M-< end-of-buffer => M-> (defun simple-beginning-of-buffer () "Move point to the beginning of the buffer; leave mark at previous position." (interactive) (push-mark) (goto-char (point-min))) 你可以使用C-h f fun来查询具体函数。 C-x C-x可以回到原来位置。 end-of-buffer 只需要把point-min换成point-max. 4.3 mark-whole-buffer函数 快捷键:C-x h (defun mark-whole-buffer () "Put point at beginning and mark at end of buffer." (interactive) (push-mark (point)) (push-mark (point-max)) (goto-char (point-min))) 4.4 append-to-buffer函数的定义 (defun append-to-buffer (buffer start end) "Append to specified buffer the next of the region. It is insert into that buffer before its point. When calling from a program, give three arguments: a buffer or the name of one, and two character numbers specifying the portion of the current buffer to be copied." (interactive "BAppend to buffer:\nr") (let ((oldbuf (current-buffer)))         (save-excursion (set-buffer (get-buffer-create buffer)) (insert-buffer-substring oldbuf start end)))) 4.5回顾 1.descibe-function, describe-variable C-h f, C-h v 2.find-tag M-. 3.save-excursion 保存当前的位点,标记,缓冲区,执行参数,最后返回原状态。 4.push-mark 在指定位置设置一个标记,并在标记环中记录原来标记的值。 5.goto-char 将位点设置为由参量指定的位置。 6.insert-buffer-substring 将一个来自缓冲区的文本域拷贝到当前缓冲区。 7.mark-whole-buffer C-x h 8.set-buffer 将Emacs的注意力转移到另一个缓冲区,但是不改变显示的窗口。 9.get-buffer-create, get-buffer 寻找一个已指定名字的缓冲区,或当指定名字的缓冲区不存在时就创建它。 chapter5 更复杂的函数 5.1 copy-to-buffer函数的定义 (defun copy-to-buffer (buffer, start, end) "...." (interactive "BCopy to buffer:\nr") (let ((oldbuf (current-buffer)))  (save-excursion    (set-buffer (get-buffer-create buffer))    (erase-buffer)    (save-excursion      (insert-buffer-substring oldbuf start end))))) 5.2 insert-buffer函数的定义 (defun insert-buffer (buffer) "Insert after point the contents of BUFFER. Puts mark a

    03

    Scheme语言实例入门--怎样写一个“新型冠状病毒感染风险检测程序” 1,表达式2,原子3,表(list) 4,点对(pair)5,向量(vector)6,变量7,

    2020的春季中小学受疫情影响,一直还没有开学,孩子宅在家说想做一个学校要求的研究项目,我就说你做一个怎么样通过编程来学习数学的小项目吧,用最简单的计算机语言来解决小学数学问题。虽然我是一个老码农,但一直不赞成教小学生学编程,觉得这是揠苗助长,小学生不应该过早的固化逻辑思维而放松形象思维,某些少儿编程机构居然教学C++游戏编程,我觉得这真是在摧残祖国的花朵。现在孩子宅在家 ,想让他学点什么好几次冒出学编程的想法都被自己给否决了,直到我看到数学老师要求同学们整理小学阶段的数学公式、概念,我看到有一个小朋友居然画出了平面几何体的“继承”关系,让我眼前一亮:这种抽象关系如果用程序来表示不正合适吗?明白抽象方法了,那么学编程问题就不大了。于是我在想应该教孩子学什么语言比较好:LOGO、VB还是炙手可热的Python?虽然我非常熟悉C#,但需要了解许多背景知识,还需要安装一个很大的框架环境,显然C#不适合小学生学习,Java也是。LOGO是老牌的儿童编程语言了,操控一个小海龟来画图很形象,VB入门简单,但要一个小学生熟悉它的集成开发环境要求还是高了点,选Python无非就是因为AI应用火它就火,除此之外我找不出它适合儿童使用的理由。

    02

    emacs配置文件3

    ;;普通设置 (setq inhibit-startup-message t);关闭起动时闪屏 (setq visible-bell t);关闭出错时的提示声 (show-paren-mode t);显示括号匹配 ;(set-default-font "-adobe-courier-medium-r-normal--14-100-100-100-m-90-iso10646-1");;字体设置 (column-number-mode t);显示列号 (setq frame-title-format "%n%F/%b");在窗口的标题栏上显示文件名称 (mouse-avoidance-mode 'animate);光标靠近鼠标指针时,让鼠标指针自动让开 (setq default-frame-alist '((height . 25) (width . 80) (menu-bar-lines . 80) (tool-bar-lines . 80)));设置窗口启动大小 (fset 'yes-or-no-p 'y-or-n-p);以 y/n代表 yes/no (setq-default make-backup-files nil);;不要生成临时文件 (setq x-select-enable-clipboard t);;允许emacs和外部其他程序的粘贴 (setq mouse-yank-at-point t);支持中键粘贴 ;(show-paren-mode 't); 高亮显示匹配括号 ;;自动插入匹配的括号 ;; enable skeleton-pair insert globally (setq skeleton-pair t) (global-set-key (kbd "(") 'skeleton-pair-insert-maybe) (global-set-key (kbd "[") 'skeleton-pair-insert-maybe) (global-set-key (kbd "{") 'skeleton-pair-insert-maybe) ;;热键设置 (global-set-key [f9] 'delete-window);F9 关闭d当前窗口 (global-set-key [f8] 'other-window);F8窗口间跳转 (global-set-key [(f2)] 'ansi-term);F2 切换到shell模式 ;(global-set-key [f3] 'split-window-vertically);F3分割窗口 (global-set-key [f12] 'my-fullscreen);F12 全屏 (global-set-key [(f4)] 'compile);编译 (global-set-key [f5] 'gdb);启动gdb (global-set-key [(f6)] 'gdb-many-windows);启动窗口gdb (global-set-key [f1] 'goto-line);设置M-g为goto-line ;(global-set-key [f7] 'other-frame);跳到其它窗格 (global-set-key [(f3)] 'speedbar);打开speedbar ;;显示行号 (load-file "~/dos/emacs/display-line-number.el") ;;(autoload `display-line-number-mode-on "display-line-number" "display mode" t) (require 'display-line-number) (global-display-line-number-mode t) ;;鼠标滚轮,默认的滚动太快,这里改为3行 (defun up-slightly () (interactive) (scroll-up 3)) (defun down-slightly () (interactive) (scroll-down 3)) (global-set-key [mouse-4] 'down-slightly) (global-set-key [mouse-5] 'up-slightly) ;;代码折 (add-hook 'c-mode-hook 'hs-minor-mode) (add-hook 'c++-mode-hook 'hs-minor-mode)   ;全屏 (defun my-fullscreen ()   (interactive)   (x-send-client-message    nil 0 nil "_NET_WM_STATE" 32    '(

    03

    C#垃圾回收机制(GC)

    虽然本文是以.net作为目标来讲述GC,但是GC的概念并非才诞生不久。早在1958年,由鼎鼎大名的图林奖得主John McCarthy所实现的Lisp语言就已经提供了GC的功能,这是GC的第一次出现。Lisp的程序员认为内存管理太重要了,所以不能由程序员自己来管理。但后来的日子里Lisp却没有成气候,采用内存手动管理的语言占据了上风,以C为代表。出于同样的理由,不同的人却又不同的看法,C程序员认为内存管理太重要了,所以不能由系统来管理,并且讥笑Lisp程序慢如乌龟的运行速度。的确,在那个对每一个Byte都要精心计算的年代GC的速度和对系统资源的大量占用使很多人的无法接受。而后,1984年由Dave Ungar开发的Small talk语言第一次采用了Generational garbage collection的技术(这个技术在下文中会谈到),但是Small talk也没有得到十分广泛的应用。 直到20世纪90年代中期GC才以主角的身份登上了历史的舞台,这不得不归功于Java的进步,今日的GC已非吴下阿蒙。Java采用VM(Virtual Machine)机制,由VM来管理程序的运行当然也包括对GC管理。90年代末期.net出现了,.net采用了和Java类似的方法由CLR(Common Language Runtime)来管理。这两大阵营的出现将人们引入了以虚拟平台为基础的开发时代,GC也在这个时候越来越得到大众的关注。 为什么要使用GC呢?也可以说是为什么要使用内存自动管理?有下面的几个原因: 1、提高了软件开发的抽象度; 2、程序员可以将精力集中在实际的问题上而不用分心来管理内存的问题; 3、可以使模块的接口更加的清晰,减小模块间的偶合; 4、大大减少了内存人为管理不当所带来的Bug; 5、使内存管理更加高效。 总的说来就是GC可以使程序员可以从复杂的内存问题中摆脱出来,从而提高了软件开发的速度、质量和安全性。

    01
    领券