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

修改Lisp函数而不重写它?

修改Lisp函数而不重写它,可以通过使用函数的闭包特性来实现。在Lisp中,函数可以作为值传递,并且可以在其他函数中定义。通过使用这种方法,可以在不重写原始函数的情况下,修改函数的行为。

以下是一个简单的示例,说明如何使用闭包来修改Lisp函数的行为:

代码语言:lisp
复制
(defun make-adder (n)
  (lambda (x) (+ x n)))

(defvar *adder-3* (make-adder 3))
(defvar *adder-5* (make-adder 5))

(funcall *adder-3* 10) ; 输出 13
(funcall *adder-5* 10) ; 输出 15

在这个示例中,我们定义了一个名为make-adder的函数,它接受一个参数n,并返回一个匿名函数,该函数接受一个参数x并返回(+ x n)。我们可以使用make-adder函数创建具有不同加数的函数,并将它们存储在变量中,如*adder-3**adder-5*。然后,我们可以使用funcall函数来调用这些函数,并将它们应用于不同的值。

这种方法允许我们在不重写原始函数的情况下,修改函数的行为。在这个例子中,我们没有直接修改make-adder函数,但我们可以通过创建具有不同加数的函数来实现类似的效果。

推荐的腾讯云相关产品:

  • 腾讯云Serverless架构:腾讯云Serverless架构允许用户在不必担心服务器管理的情况下开发和运行应用程序。用户只需要编写代码,并将其部署到腾讯云Serverless架构中,即可实现自动扩展和按需计费。
  • 腾讯云Function:腾讯云Function是一种事件驱动的计算服务,允许用户运行代码以响应事件。用户可以使用腾讯云Function来处理来自腾讯云或第三方服务的事件,并自动扩展以处理高负载。
  • 腾讯云API Gateway:腾讯云API Gateway是一种完全托管的API服务,允许用户轻松创建、发布、维护和监控API。用户可以使用腾讯云API Gateway将其应用程序与其他服务集成,并实现安全、稳定、可扩展的API访问。
页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Clojure与LispClojure与Lisp

Clojure 是完全的,真正意义上的神圣的lisp语言的一个方言. lisp语言因为其无以伦比强大能力和几乎无穷的表达力获得了盛誉,Clojure自然也例外....你在程序运行的时候取修改程序,不需要重新编译或重启 程序....一种数据类型应该有的功能,都有。 3 递归 Lisp是第一种支持递归函数的高级语言。 4 变量的动态类型 在Lisp语言中,所有变量实际上都是指针,所指向的值有类型之分,变量本身没有。...Lisp宏无所包,既可能是某样表达式的缩略形式,也可能是一种新语言的编译器。如果你想真正地理解Lisp语言,或者想拓宽你的编程视野,那么你必须学习宏。...Clojure是这样的有潜力、接地气,那么如果你要选择一门新语言来玩玩,选什么?

1.8K30

编写高质量可维护的代码:编程范式

由于 JS 中对象传递的是引用地址,即使我们使用 const 关键词声明对象时,依旧是可以变的。这样就会导致我们可能会随意修改对象。...简单来说,就是只传递给函数一个参数来调用它,让返回一个函数去处理剩下的参数。...多态的表现方式有重写,重载和接口,原生 JS 能够实现的多态只有重写重写重写是子类可继承父类中的方法,不需要重新编写相同的方法。...但有时子类并不想原封不动地继承父类的方法,而是想作一定的修改,这就需要采用方法的重写。方法重写又称方法覆盖。...方法之后得到了不同的结果, getName 方法只是继承并没有重写

47220

Yet Another OOP : 基于原型而非基于类

例如c++的多态只支持dynamic dispatch(虚函数),不支持multiple dispatch。...维持、保护、并隐藏着内部状态,延迟绑定一切,并且仅能通过message修改其他节点的状态。 可见封装继承多态,只是编程语言对一种OOP的实现罢了,就连公认的函数式编程FP语言Lisp都能实现OOP。...很多框架例如Vue都会通过扩展空对象的方式自己重写一套原型链。 例如,在JavaScript中,默认的顶级对象是Object,自身具备一些通用的属性和方法,被原型链上的所有对象继承。...对于JavaScript而言,则是优先查找当前对象,然后沿着原型链查找原型对象上是否有该属性,修改当前对象的属性并不影响到原型对象的属性,修改原型对象的属性则可能会影响到当前对象。...函数和对象绑定,不是和类绑定,天生就实现了dynamic dispatch。就像是C++为了实现这个功能,也要将vptr和对象绑定一样。

32530

一文读懂基于 Yaegi 解释器开发可热插拔的 Traefik 插件

3、Gisp:Gisp 是一个使用 Go 语言编写的 Lisp 解释器,支持基本的 Lisp 语法和函数,并提供了一些扩展功能,如 Go 函数和类型的调用。...Gisp 是一个轻量级的 Lisp 方言,的语法和特性与 Scheme 和 Clojure 有很多相似之处。...支持动态类型、高阶函数、闭包、宏扩展等 Lisp 特性,并能够直接调用 Go 语言的函数和方法。...6、Golo:Golo 是一个基于 Go 语言实现的 Lisp 解释器。支持大多数的 Lisp 特性,包括宏扩展和动态类型。...消除了语法切换的负担,无需重写修改慢速代码以提高性能,并且能够在脚本级别完全访问 goroutine、通道、类型安全等。

1.3K51

Lisp的本质(The Nature of Lisp)学习思考

他们又反问我, "你自己为啥试一下?" 好吧, 我来试一下。这篇文章就是我尝试的结果。我要用熟悉的直观的方法来解释Lisp, 我希望有勇气的人读完, 拿杯饮料, 深呼吸一下, 准备被搞得晕头转向。...使用XML不是Java代码, 到底有什么好处? 为什么写一组Java类, 提供api来满足基本任务(拷贝目录, 编译等等), 然后在Java里直接调用这些代码?...我们将会依赖一组核心任务(如果你原意, 也不妨把称作标准库), 不用管有没有Java 环境了。...Lisp函数的角色十分特殊, 函数也是一种数据类型, 就像整数和字符串一样, 因此可以把赋值给符号。乘法函数Lisp的内置函数, 默认赋给*, 你可以把其他函数赋值给*, 那样*就不代表乘法了。...而我们的迷你语言则完全内嵌在Lisp中, 只消几分钟就做出来了。 我们已经说过了DSL的好处, 这也就是Ant用XML直接用Java的原因。

1.7K60

函数式编程初探

不仅最古老的函数式语言Lisp重获青春,而且新的函数式语言层出穷,比如Erlang、clojure、Scala、F#等等。...内容涉及数学(我也不懂Lambda Calculus),也涉及高级特性(比如lazy evaluation和currying),只求尽量简单通俗地整理和表达,我现在所理解的"函数式编程"以及的意义...函数式编程强调没有"副作用",意味着函数要保持独立,所有功能就是返回一个新的值,没有其他行为,尤其是不得修改外部变量的值。 4. 不修改状态 上一点已经提到,函数式编程只是返回新的值,不修改系统变量。...因此,不修改变量,也是的一个重要特点。 在其他类型的语言中,变量往往用来保存"状态"(state)。不修改变量,意味着状态不能保存在变量中。函数式编程使用参数保存状态,最好的例子就是递归。...其他类型的语言就做不到这一点,因为s1可能会修改系统状态,s2可能会用到这些状态,所以必须保证s2在s1之后运行,自然也就不能部署到其他线程上了。

77560

来来来,咱们元编程入个门

lisp(以下谈到的 lisp,皆为其方言 clojure)是一门直接把类似 AST 的语法暴露给程序员的语言。因此,的语法看起来会非常别扭: ?... elixir 虽不是 lisp 族的语言,语法和 lisp 截然不同,但它也从语言设计之初,就考虑把语法树暴露给程序员: ?...的 quote 不是 syntax quote,的作用是执行表达式,直接返回原始的表达式,我们对比一下: ?... elixir 是没有 lisp 里 quote 的概念的(因为不需要),只有 syntax quote / unquote,语法是 quote do ... end 和 unquote(expression...我们把之前 unless 的例子稍微修改一下,加一句打印: ? 为了能让结果更加清晰,我们写一个 compare 函数,然后使用 unless: ? 我们可以看到,函数被执行了两遍。

917100

函数式编程初探

不仅最古老的函数式语言Lisp重获青春,而且新的函数式语言层出穷,比如Erlang、clojure、Scala、F#等等。...内容涉及数学(我也不懂Lambda Calculus),也涉及高级特性(比如lazy evaluation和currying),只求尽量简单通俗地整理和表达,我现在所理解的"函数式编程"以及的意义...不修改状态 上一点已经提到,函数式编程只是返回新的值,不修改系统变量。因此,不修改变量,也是的一个重要特点。 在其他类型的语言中,变量往往用来保存"状态"(state)。...不修改变量,意味着状态不能保存在变量中。函数式编程使用参数保存状态,最好的例子就是递归。下面的代码是一个将字符串逆序排列的函数演示了不同的参数如何决定了运算所处的"状态"。   ...其他类型的语言就做不到这一点,因为s1可能会修改系统状态,s2可能会用到这些状态,所以必须保证s2在s1之后运行,自然也就不能部署到其他线程上了。

627100

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

代表了语言设计的一种完全不同的方向。Lisp是无意中从纯理论发展为编程语言,Fortran从一开始就是作为编程语言设计出来的。...一种数据类型应该有的功能,都有。   3. 递归。Lisp是第一种支持递归函数的高级语言。   4. 变量的动态类型。...在其他语言中,这种形式只是经过解析在后台产生,但是Lisp直接采用它作为表达形式。由列表构成,列表则是Lisp的基本数据结构。 用一门语言自己的数据结构来表达该语言,这被证明是非常强大的功能。...Lisp宏无所包,既可能是某样表达式的缩略形式,也可能是一种新语言的编译器。如果你想真正地理解Lisp语言,或者想拓宽你的编程视野,那么你必须学习宏。...六、 就算Lisp确实代表了目前主流编程语言不断靠近的一个方向,这是否意味着你就应该用它编程呢? 如果使用一种不那么强大的语言,你又会有多少损失呢?有时采用最尖端的技术,也是一种明智的选择吗?

1.2K60

PHP 是最糟糕的编程语言?

具有先进的面向对象编程层、多重继承、一流的对象以及函数和类型。LISP 似乎是开发人员心中想要的编程语言。 1991 年,LISP 这么编程语言可能处于有史以来的最佳状态。...C 语言是为 Unix 设计的, Unix 是用 C 语言设计的。的开发人员与麻省理工学院的 LISP 及其作者有着不同的设计立场。 在 1972 年,C 语言被设计成一种简单的语言。...不过,一般而言,数组函数是一致的,字符串函数也是一致的。与底层 C 库保持一致比在语言中保持一致要简单得多。 PHP 在其他方面也足够一致。...尽管如此,的简单性还是使它可以用于 Web 以外的场合。PHP 最初的目的就是为 Web 编程提供最基本的功能,这一趋势一直持续至今。 修改核心语言通常是由开发人员的需求驱动。...如果未来有需要,我们可以随时修改语言或为添加新功能。 更糟就是更好吗? Gabriel 承认,“更糟就是更好”的哲学指的是设计看起来很糟糕,也许不应该作为更好的选择。

1.7K20

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

语法扩展式 真正的宏起源于Lisp. 这个得益于Lisp语言本身的一些特性: ? 的语法非常简单。..., 只不过这个函数必须返回一个quoted数据; 当调用这个宏时,Lisp会使用unquote函数将宏返回的quoted数据转换为程序。...Lisp宏的灵活性得益于简单的语法(S-表达式可以等价于的AST),对于复杂语法的语言(例如Javascript),要实现类似Lisp的宏就难得多....Babel你需要在配置文件中配置各种插件和选项,尤其是团队项目构建有统一规范和环境时,项目构建脚本修改可能有限制。...模块化的宏是源代码的一部分,不是构建脚本的一部分,这使得它们可以被灵活地使用、重构以及废弃。

1.5K31

不管是嵌套 XML,还是 Lisp 嵌套括号,还是 XXX 的 Map 数据结构,一切都是树形结构——映射。Lisp的本质(The Natur

保存在不可执行的文件中。我们可以把解析成树节点, 然后做任意的转换。显 易见, 它是数据。不过且慢, 虽然语法有点陌生, 可它又确确实实是一个add函数, 对吧?...使用XML不是Java代码, 到底有什么好处? 为什么写一组Java类, 提供api来满 足基本任务(拷贝目录, 编译等等), 然后在Java里直接调用这些代码?...我们将会依赖一组核心任务(如果你原意, 也不妨把称作标准库), 不用管有没有Java 环境了。...Lisp函数的角色十分特殊, 函数也是一种数据 类型, 就像整数和字符串一样, 因此可以把赋值给符号。...而我们的迷你语言则完全内嵌在Lisp中, 只消几分钟就做出来了。 我们已经说过了DSL的好处, 这也就是Ant用XML直接用Java的原因。

1.3K20

一名Clojurian的Emacs配置

这个过程一般会充满修改然后重启的重复性机械劳作,偶尔会遭遇无论怎么修改就是生效、甚至遍寻google也一无所获的挫折,但是我就是无法厌倦。...这就不得不提起Clojure这门lisp方言,出于对lisp函数式编程的痴迷,我选择了基于JVM的Clojure作为自己的偏好语言,emacs天生为lisp而生。...对emacs lisp不熟悉不要紧,先找个教程练习一下的用法,比如learnxinyminutes就非常不错。完成这个教程,大体不会对elisp犯怵了。...接下来,只需要使用c-h v和c-h f查看elisp中定义的变量函数就能很快上手自行配置。...这种非异常的知识点很难通过搜索引擎找到满意的答案,阅读文档恰恰是最合适的解决方式。

2.7K20

Clojure 学习入门(1)—— 学习资料

Clojure(发音类似"closure",['kləʊʒə(r)])是一套现代的Lisp语言的动态语言版,它是一个函数式多用途的语言,其语法和其他的Lisp一样,都是建立在 S-expression...Clojure 是完全的,真正意义上的神圣的lisp语言的一个方言。 lisp语言因为其无以伦比强大能力和几乎无穷的表达力获得了盛誉,Clojure自然也例外。...你在程序运行的时候取修改程序,不需要重新编译或重启程序。...但是,历史上也有对lisp进行诋毁的人,或许称为抱怨更为合适. lisp发展过程中,没有完整的规范, 各种兼容的实现,陈旧落伍的限制.cruft accumulate 在其存在的四五十年里一直存在....对于 大多数人来说,的语法过于诡异了。 Clojure 修正上面的大多数这些问题. 保留了 lisp 的思想和哲学,并同时清除了过去的很多限制.

1.3K10

Lisp语言简介_c++是什么语言

这个比较小众的编程到底是什么~ ————————————————————————— LISP(全名LISt Processor,即列表处理语言),由约翰·麦卡锡在1960年左右创造的一种基于λ演算的函数式编程语言...在Unix/Linux系统中,还有一种和Emacs一起的Emacs LispEmacs正是用Lisp作为扩展语言进行功能扩展的)非常流行,并建立了自己的标准。...(b . c)) 就表示成 (a b . c) 若一个cons cell第二项为空,就省略写,例如: (a ....当表达式以七个原始操作符中的五个开头时,总会对其自变量求值的....我们称这样的操作符为函数. 发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/168319.html原文链接:https://javaforall.cn

2.2K20

日拱一卒,伯克利CS61A,居然有Lisp这样的语言……

这一次作业使用的是Lisp的一个方言版本——scheme,简单介绍一点作业当中会用到的语法。 语法 基本运算 Lisp最大的特点就是代码的表示形式,和常规的语言完全不同。...比如我们要定义一个pi,让等于3.14,写成: (define pi 3.14) 定义函数 我们定义函数同样需要使用define关键字,比如我们定义一个square函数来计算一个数的平方,写出来就是这样...之后括号里的内容是函数的计算过程。准确的说在Lisp当中,这不叫函数(function),叫过程(procedure)。...如果我们这么干,就会显示成这样: 表示这不是一个规范的list。 使用cons一个一个嵌套非常麻烦,所以Lisp中专门提供了一个操作符叫做list,用来直接创建list。...一个没有以null结尾的list会被视为是规范的,在展示时会显示一个. 比如(cons 1 (cons 2 3))会展示成:(1 2 . 3)。

91940

写本Racket入门书

但Paul Graham在「黑客与画家」中对lisp的无比推崇又让我一直如鲠在喉,征服lisp仿佛自己始终没能窥探编程的奥义,那种感觉,估计和搞到了法国却搞不定约瑟芬的拿破仑一样一样的。...不少读者在看了我周二的文章「走进 racket(lisp) 的世界」后自豪地说自己的学校就开设了Racket的课程,作为编程入门语言,这真是羡煞死我。...官方文档格式保持一致,所以本书不会在公众号上连载(这么techy的内容估计大伙也没心思看),也不会在百度阅读发布(转格式估计都要累死我),就像我在书中的「前言」里写到的那样,写这本书是出于私利 —— 以教代学,并不代表我对...1) 开始:餐前甜点(已完成) 2) Racket语言概要:基本语法和数据结构(正在撰写) 3) 写点有意义的代码:用Racket解决一些实际问题 4) Racket语言进阶:Racket的编程思想,函数式编程思想...这个没想好,看我学到什么程度 14) Racket的其它特性:前面章节没有提到的,但也比较重要的概念和库,算是拾遗 15) 下一站:Typed Racket:Racket最终会用Typed Racket重写大部分库来提高性能

2.3K80
领券