首页
学习
活动
专区
工具
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代码更加简洁和易读。

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

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

相关·内容

Emacs Lisp

;; 为了实验本教程中的lisp命令,我们要让Emacs工作lisp-interaction-mode工作模式下, ;; 这个模式可以让我们缓冲区中和Emacs进行互动,并且直接执行Lisp命令,得到结果...;; insert函数还可以接受变量作为参数,我们之前已经给my-name变量赋过值了 ;; 所以下面命令的输出结果是 "Hello, I am Bastien" (insert "Hello, I am..." my-name) ;; defun命令用来定义一个函数,语法是 ;; (defun 函数名 (参数列表) (函数体)) (defun hello () (insert "Hello, I am...\n" "visitor") ;; 现在我们利用format函数来改进之前定义的hello函数 (defun hello (name) (insert (format "Hello %s!...; 函数体的内部又使用了let函数,给一个局部变量your-name赋值 ;; 最后把参数和局部变量格式化的打印出来 (defun greeting (name) (let ((your-name "

2.2K30

Emacs Lisp

;; 为了实验本教程中的lisp命令,我们要让Emacs工作lisp-interaction-mode工作模式下, ;; 这个模式可以让我们缓冲区中和Emacs进行互动,并且直接执行Lisp命令,得到结果...;; insert函数还可以接受变量作为参数,我们之前已经给my-name变量赋过值了 ;; 所以下面命令的输出结果是 "Hello, I am Bastien" (insert "Hello, I am..." my-name) ;; defun命令用来定义一个函数,语法是 ;; (defun 函数名 (参数列表) (函数体)) (defun hello () (insert "Hello, I am...\n" "visitor") ;; 现在我们利用format函数来改进之前定义的hello函数 (defun hello (name) (insert (format "Hello %s!...; 函数体的内部又使用了let函数,给一个局部变量your-name赋值 ;; 最后把参数和局部变量格式化的打印出来 (defun greeting (name) (let ((your-name "

2.3K40

Emacs Lisp2

;; 为了实验本教程中的lisp命令,我们要让Emacs工作lisp-interaction-mode工作模式下,;; 这个模式可以让我们缓冲区中和Emacs进行互动,并且直接执行Lisp命令,得到结果...;; insert函数还可以接受变量作为参数,我们之前已经给my-name变量赋过值了;; 所以下面命令的输出结果是 "Hello, I am Bastien"(insert "Hello, I am..." my-name);; defun命令用来定义一个函数,语法是;; (defun 函数名 (参数列表) (函数体))(defun hello () (insert "Hello, I am " my-name...(defun hello (name) (insert "Hello " name));; 然后调用新的hello函数,并且提供一个参数。...\n" "visitor");; 现在我们利用format函数来改进之前定义的hello函数(defun hello (name)(insert (format "Hello %s!

95240

【java筑基】——为什么java中方法的参数传递机制没有引用传递

前 言 作者简介:半旧518,长跑型选手,立志坚持写10年博客,专注于java后端 ☕专栏简介:深入、全面、系统的介绍java的基础知识 文章简介:本文将介绍为什么java中方法的参数传递机制没有引用传递...,建议收藏备用,创作不易,敬请三连哦 值传递是指在调用函数或者方法时将实际参数复制一份传递到函数中,这样函数中如果对参数进行修改,将不会影响到实际参数。...所谓引用传递是指在调用函数或者方法时将实际参数的地址传递到函数中,那么函数中对参数所进行的修改,将影响到实际参数。 Java中的方法不能够独立存在,调用方法必须通过类或者对象来作为主调者。...基本数据类型和引用数据类型的参数传递机制都是值传递。...java中方法使用引用变量作为形参仍然是值传递,传递的是参数副本。

62310

深入浅出 Babel 下篇:既生 Plugin 何生 Macros

如上图,宏本质上不是C语言的一部分, 它由C预处理器提供,预处理器在编译之前对源代码进行文本替换,生成真正的 C 代码,再传递给编译器。...这种数据即程序、程序即数据的概念,使得Lisp可以轻松地自定义宏. 不妨来看一下Lisp定义宏的示例: ; 使用defmacro定义一个nonsense宏, 接收一个function-name参数....既然 Babel 有了 Plugin 为什么又冒出了个 babel-plugin-macros?...这样的好处是,开发者不需要再关心构建的细节, 另外构建工具的升级也变得非常方便, 直接升级 react-scripts即可。...如果自己维护构建脚本的话,升一次级你需要升级一大堆的依赖,如果你要维护跨项目的构建脚本,那就更蛋疼了 我为什么要用vue-cli3?》

1.5K31

为什么Lisp语言如此先进?(译文)

由于我不懂Lisp语言,所以田春同学帮忙校读了一遍,纠正了一些翻译不当之处,在此表示衷心感谢。 ============================ 为什么Lisp语言如此先进?...Lisp语言中,函数与整数或字符串一样,也属于数据类型的一种。它有自己的字面表示形式(literal representation),能够储存在变量中,也能当作参数传递。...Common Lisp的写法如下:   (defun foo (n)     (lambda (i) (incf n i))) Ruby的写法几乎完全相同:   def foo (n)     ...和Ruby的版本,有更多的语法元素,因为Perl语言中,你不得不手工提取参数。...面向对象编程的语言中,你能够在有限程度上模拟一个闭包(即一个函数,通过它可以引用由包含这个函数的代码所定义的变量)。

1.2K60

函数式编程初探

引用透明 引用透明(Referential transparency),指的是函数的运行不依赖于外部变量或"状态",只依赖于输入的参数,任何时候只要参数相同,引用函数所得到的返回值总是相同的。...这就叫"引用不透明",很不利于观察和理解程序的行为。 三、意义 函数式编程到底有什么好处,为什么会变得越来越流行? 1....Paul Graham《黑客与画家》一书中写道:同样功能的程序,极端情况下,Lisp代码的长度可能是C代码的二十分之一。...如果程序员每天所写的代码行数基本相同,这就意味着,"C语言需要一年时间完成开发某个功能,Lisp语言只需要不到三星期。反过来说,如果某个新功能,Lisp语言完成开发需要三个月,C语言需要写五年。"...所以,可以在运行状态下直接升级代码,不需要重启,也不需要停机。Erlang语言早就证明了这一点,它是瑞典爱立信公司为了管理电话系统而开发的,电话系统的升级当然是不能停机的。 (完)

78760

函数式编程初探

引用透明 引用透明(Referential transparency),指的是函数的运行不依赖于外部变量或"状态",只依赖于输入的参数,任何时候只要参数相同,引用函数所得到的返回值总是相同的。...这就叫"引用不透明",很不利于观察和理解程序的行为。 三、意义 函数式编程到底有什么好处,为什么会变得越来越流行? 1....Paul Graham《黑客与画家》一书中写道:同样功能的程序,极端情况下,Lisp代码的长度可能是C代码的二十分之一。...如果程序员每天所写的代码行数基本相同,这就意味着,"C语言需要一年时间完成开发某个功能,Lisp语言只需要不到三星期。反过来说,如果某个新功能,Lisp语言完成开发需要三个月,C语言需要写五年。"...所以,可以在运行状态下直接升级代码,不需要重启,也不需要停机。Erlang语言早就证明了这一点,它是瑞典爱立信公司为了管理电话系统而开发的,电话系统的升级当然是不能停机的。

631100

《SICP》读书笔记之一:构造过程抽象(上)

正常工作的计算机里,一个计算过程将精密而准确地执行相应的程序。 为了描述计算过程,我们需要一种合适的语言,本书中将使用 Lisp。...Lisp 并不是一种主流语言,但其非常适合用来学习程序构造和数据结构。Lisp 的一个重要特征是其将过程本身作为一种数据来表达和操作,这种表示过程的数据 Lisp 中被称为 procedures。...一种最基本的表达式就是数字, Lisp 中输入一个数,解释器将打印出该数字。... Lisp 方言 Scheme 中,通过 define 给事物命名,其格式如下: (define size 2) 一旦名字 size 与数字 2 关联后,我们就可以通过该名字去引用 2 这个值了: Input...用户使用一个过程时,并不需要去弄清它是如何实现的。 1.8.1 局部名 在过程实现中,一个不需要使用者去关心的细节是实现者对于过程中形式参数名称的选择。

75120

--03:控制流

1.表达式求值 讨论控制流之前先讨论下表达式的问题,先明确两个概念:运算符通常是指那些采用特殊语法形式的内部函数(比如+-*/等),运算对象指的是运算符的参数(如2+3,2和3就是运算对象),那么运算符和运算对象的组合就是表达式...纯函数式语言中是没有副作用的,好比我们学的那些数学方程式,你给你一个特定的参数,这个方程式只是依赖或不依赖其外围引用环境,如果这一刻它的计算结果是2,那么任何时刻都是2,一个有趣的术语叫引用透明,用来描述纯函数式中的表达式的特性的...但是如果没有进一步的规则描述,我们无法得知a-f(b)是否c*d之前运行。诸如此类:对于f(a,g(b),c)这个子程序调用,我们也不知这三个参数的求值顺序。 为何这个问题那么重要呢?...比如(a*b+f(c)),我们可能会希望执行a*b之前调用f(c)。因为如果先计算乘法,则在调用f(c)之前就要先保存起来乘积,因为f(c)可能会用光所有的寄存器。  ...6.2应用序和正则序求值  在上述的讨论中,我们都假定所有参数传入子程序之前已经完成了求值,但是实际中这并不是必须的。

2K100
领券