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

Clojure:如何在运行时创建函数

Clojure: 如何在运行时创建函数

Clojure 是一种支持运行时代码生成的编程语言,可以在运行时创建函数。这使得 Clojure 成为一个强大的元编程工具。以下是如何在 Clojure 中在运行时创建函数的方法:

1. 使用 fn 关键字

fn 是一个特殊的宏,可以用来创建匿名函数。在运行时,可以使用 fn 创建新的函数。例如:

代码语言:clojure
复制
(defn create-adder []
  (fn [x y] (+ x y)))

(def adder (create-adder))

(adder 3 4) ; 输出 7

在这个例子中,create-adder 函数返回一个匿名函数,该函数接受两个参数并返回它们的和。

2. 使用 eval 函数

eval 函数可以用来执行一个字符串形式的 Clojure 表达式,并返回其结果。例如:

代码语言:clojure
复制
(defn create-adder []
  (eval "(fn [x y] (+ x y))"))

(def adder (create-adder))

(adder 3 4) ; 输出 7

在这个例子中,create-adder 函数使用 eval 函数来创建并返回一个匿名函数,该函数接受两个参数并返回它们的和。

3. 使用 intern 函数

intern 函数可以用来将一个新的符号与一个命名空间关联。例如:

代码语言:clojure
复制
(defn create-adder []
  (intern 'my-app 'adder (fn [x y] (+ x y))))

(create-adder)

(my-app/adder 3 4) ; 输出 7

在这个例子中,create-adder 函数使用 intern 函数将一个新的符号 adder 与命名空间 my-app 关联,并将其值设置为一个匿名函数,该函数接受两个参数并返回它们的和。

4. 使用 defdefn

defdefn 宏可以用来定义新的符号和函数。在运行时,可以使用这些宏创建新的函数。例如:

代码语言:clojure
复制
(defn create-adder []
  (eval "(defn adder [x y] (+ x y))"))

(create-adder)

(adder 3 4) ; 输出 7

在这个例子中,create-adder 函数使用 eval 函数来定义一个新的函数 adder,该函数接受两个参数并返回它们的和。

总之,Clojure 提供了多种方法来在运行时创建函数,这些方法可以用来实现元编程和动态编程。

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

相关·内容

silverlight如何在运行时用代码动态控制(或创建)动画

silverlight做一些复杂动画时,不可能所有的动画都事先用Blend之类的设计工具"画"好(或者在设计期就在vs里编好),很多时候我们希望在运行时能动态控制动画,或者凭空动态创建一段动画....sl3.0的官方sdk文档里有一节"以编程方式使用动画"讲的就是这个,今天研究了下整理分析于此: 对于事先"画"好(或者称之为在设计期准备好的动画),我们可以在运行时通过名字获取动画引用,进而改变某些属性...StackPanel中横向放了4个矩形,同时放置了三个完全相同的double型动画(用来让对象的透明度从1变到0,即渐渐淡去),实现目的:4个矩形,3个动画,显示按照一一对应的默认原则,总会有一个矩形无法分配到动画,如何实现重用呢...这种情况就要用到下面提到的代码动态创建动画了 3。示例3 代码动态创建动画 理解起来很简单,代码创建动画对象,并让其播放。...,必须放在构造函数中的InitializeComponent()之后调用,原因很简单,如果组件尚未初始化完毕,这时向根容器加入一些动态创建的元件当然会报错。

1.5K100

Java如何在运行时识别类型信息?

在Java中,并不是所有的类型信息都能在编译阶段明确,有一些类型信息需要在运行时才能确定,这种机制被称为RTTI,英文全称为Run-Time Type Identification,即运行时类型识别,有没有一点...这也就是说,Java能够在运行时自动识别类型的信息,它不会因为wanger的引用类型是Author而丢失wanger真正的类型信息(Writer)。Java是怎么做到这一点呢?...当Java创建某个类的对象,比如Writer类对象时,Java会检查内存中是否有相应的Class对象。...一旦Class对象加载成功,就可以用它来创建这种类型的所有对象。这也就是说,每个对象在运行时都会有对应的Class对象,这个Class对象包含了这个对象的类型信息。...但写作的好处就在于此,在向读者解释“Java如何在运行时识别类型信息”的过程中,我的思路逐渐地清晰了起来——这真是一个自我提升的好办法!

1.1K20
  • 如何在运行时保护容器化工作负载

    如何在运行时保护容器化工作负载 翻译自 How to Protect Containerized Workloads at Runtime 。...运行时安全性:预防优先 运行时安全性可能听起来像是一种超级特定的要求或方法,但 Bhatt 和其他专家指出,如果做得好,运行时安全的整体方法可以增强整个环境和组织的安全态势。...Calico 开源是一个开源网络和网络安全项目,用于容器,虚拟机和基于本机主机的工作负载,以及 Calico Cloud 和 Calico Enterprise ,后者是 Tigera 的商业平台,建立在它创建的开源项目之上...这是预防优先思维模式的核心,侧重于引入工具持续检查的可靠威胁源 - 不仅在构建和部署期间,而且在运行时也是如此。...运行时安全工具和实践的存在是为了解决容器化环境创建的更大、更动态的威胁面。Bhatt 粗略地将今天的软件环境比作有很多门窗的大房子。传统的安全方法可能只关注前门和后门。运行时安全性试图保护整个房子。

    12910

    在运行时与构建时如何保护云计算基础设施

    令人感兴趣的是,对于许多人来说,云计算安全性只与在运行时发生的错误配置和违规行为有关。 如果在构建时不关注流程和代码,就无法确定基础设施问题,这与企业设计和构建现代云计算基础设施的方式不符。...如果构建不可变的基础设施,则需要开始考虑如何保护不可变的基础设施,而只是孤立地提高运行时的安全性是不够的。...(6)重复的错误配置 对于利用基础设施代码框架来协调云计算资源的团队而言,只是在运行时修复错误配置会带来重复发生的风险。为了确保不会发生云计算配置错误,必须在源头进行补救。...通过使用基础设施即程序代码(IaC)扫描程序(例如开放源代码工具Checkov),配置文件被视为独立的清单,用于描述如何配置资源和设置属性。...例如,假设一个组织在运行时管理网络组件并在构建时计算资源,知道已加固的VPC或安全组将确保外人无法访问它,因此可以很容易地抑制暴露在全球互联网上面向EC2的标识。

    1.2K10

    javascript 动态函数如何创建

    前言 JavaScript作为一门动态语言,提供了多种创建动态函数的方法。动态函数创建允许我们在运行时根据需要生成函数,从而实现灵活的编程和动态逻辑。...本文将介绍动态函数的概念,探讨几种常用的方法来创建动态函数,并分享一些动态函数的应用场景。 动态函数的概念 动态函数在运行时创建函数,其代码可以动态生成或修改。...创建动态函数的方法 1 eval() eval() 函数可以将字符串作为 JavaScript 代码进行解析和执行。通过将函数代码作为字符串传递给 eval(),可以在运行时创建函数。...箭头函数可以通过字面量的方式创建,并且可以在运行时动态生成。...; } // 调用动态函数 const dynamicArrowFunc = createDynamicArrowFunction(); dynamicArrowFunc(); 总结 动态函数创建允许我们在运行时根据需要生成函数

    49110

    「React 手册 」如何创建函数组件?

    大家好,在前面的几篇相关文章里,我们一起学习了如何使用类的方式声明组件,以及如何属性传值和处理本地数据状态,本篇文章我们一起学习如何使用函数的方式进行声明组件。...React 16.8 版本引入了 Hooks 技术,函数组件就变得强大起来,它可以让react函数组件也拥有状态,不仅解决了React一些常见的问题,同时又让组件变得更简单、简洁、更易于阅读和重构,本篇文章将会针对...如何创建简单的函数组件 基于上篇文章的例子,我们来尝试下通过函数的方式改写下公共组件:头组件、底部组件、内容组件等。...、更改状态是如此的轻松,接下来我们来初步实现一个Hook的例子: 1、首先我们在 component 目录下创建 MyName 目录,创建 MyName 组件文件。...小节 关于函数式组件的内容就介绍到这里,本篇文章我们基于以前例子,将公共组件通过函数组件的方式进行了改写,并初步了解了什么是 Hooks,最后一起完成了一个简单的实例,下篇文章,我们将通过实例的方式学习函数的生命周期方法

    2.7K20

    Clojure 运行原理之编译器剖析

    第二篇将主要分析 Clojure 程序编译成的 bytecode 如何保证动态语言的特性以及如何加速 Clojure 程序执行速度,这会涉及到 JVM 的类加载机制、反射机制。 编译型 VS....但是 Clojure 与 Java 不一样的地方在于,Clojure 可以在运行时进行编译然后加载,而 Java 明确区分编译期与运行期。.../use时使用 eval,当调用clojure.core/eval时使用 这三个入口函数都会依次调用 macroexpand、analyze 方法,生成Expr对象,compile 函数还会额外调用...Clojure 里面通过defmacro函数创建宏,它会调用var的setMacro函数来设置元信息macro为true。...根据 JVM bytecode 的规范,每个.class文件都必须由类组成,而 Clojure 作为一个函数式语言,主体是函数,通过 namespace 来封装、隔离函数,你可能会想当然的认为每个 namespace

    99930

    如何使用CSS创建高级动画,这个函数必须掌握

    创建高级动画听起来是一个很难的话题,但好消息是,在CSS中,可以将多个简单的动画相互叠加,以创建一个更复杂的动画 在这节课中,我们会学习如下几点: 什么是贝塞尔曲线,以及如何用一行CSS来创建一个 "复杂..."的动画 如何将动画相互叠加以创建一个高级动画 如何通过应用上面学到的两点来创建一个过山车动画 什么是贝塞尔曲线 CSS中的 cubic-bezier 函数是一个缓动函数,可以让我们完全控制动画在时间上的表现...下面是官方的定义: 贝塞尔缓动函数是一种由四个实数定义的缓和函数,指定了贝塞尔曲线的两个控制点P1和P2,其端点P0和P3分别固定在(0, 0)和(1, 1)。...cubic-bezier函数来完成!...总结 在本节中,我们介绍了如何结合多个关键帧来创建一个复杂的动画路径。我们还介绍了贝塞尔以及如何使用它们来创建你自己的缓动函数。建议大家自己多多动手,才能更好的掌握 css 动画。

    6.8K20

    如何在Keras中创建自定义损失函数

    如果预测值与实际值相差甚远,损失函数将得到一个非常大的数值。 Keras 是一个创建神经网络的库,它是开源的,用 Python 语言编写。...Karim MANJRA 发布在 Unsplash 上的照片 keras 中常用的损失函数 ---- 如上所述,我们可以创建一个我们自己的自定义损失函数;但是在这之前,讨论现有的 Keras 损失函数是很好的...在这种情况下,设计一个定制损失函数将有助于实现对在错误方向上预测价格变动的巨大惩罚。 我们可以通过编写一个返回标量并接受两个参数(即真值和预测值)的函数,在 Keras 中创建一个自定义损失函数。...我们的模型实例名是 keras_model,我们使用 keras 的 sequential()函数创建模型。 我们有三个层,都是形状为 64、64 和 1 的密集层。...你可以查看下图中的模型训练的结果: epoch=100 的 Keras 模型训练 结语 ---- 在本文中,我们了解了什么是自定义损失函数,以及如何在 Keras 模型中定义一个损失函数

    4.5K20

    如何学python 第10课 创建自己的函数

    这节课我们来学习函数。我们将会介绍什么是函数,以及如何创建函数函数是什么? 函数是一系列指令的集合,创建完成后你就能通过函数的名称方便的调用这些函数。这一系列指令的集合最终会返回一些什么。 ?...但是如果我们在函数内部创建一个变量,它就只能在函数内部被调用而不能在函数外部调用;这样的变量就叫做局部变量(local variable)。...函数和方法(method)一样可以传入参数,我们稍后会介绍。 好啦,我们大概已经知道什么叫做函数了,现在让我们试试如何制作我们自己的函数。 定义函数 当我们创建函数的时候,我们需要先对函数进行定义。...这就是函数的作用,通过简单call函数名字的方式,我们就可以完成写在函数定义里的整套语句。 第二个自定义函数 第二个函数会比第一个复杂一些。...小结 今天我们学习了如何创建自定义函数。自定义函数可以让我们的函数更加的简洁明了,增加了代码的复用性。函数也是一个将会伴随着我们整个编程过程的东西,所以一定要学好。

    974120

    精读《深度学习 - 函数式之美》

    1 引言 函数式语言在深度学习领域应用很广泛,因为函数式与深度学习模型的契合度很高,The Beauty of Functional Languages in Deep Learning — Clojure...然而在生产环境中,基于 性能和安全性 的考虑,一般会使用函数式语言 Clojure 或 Haskell。 在生产环境中,可能要并发出里几百万个参数,因此面临的挑战是:如何高效、安全的执行这些运算。...比如说 Clojure,它甚至可在两个同时修改同一引用的程序并发运行时,自动重试其中之一,而不需要手动加锁: (import ‘(java.util.concurrent Executors)) (defn...test-stm 10 10 10000) -> (550000 550000 550000 550000 550000 550000 550000 550000 550000 550000) 上面的代码创建了引用...(refs),同时创建了多个线程自增这个引用对象,按理说每个线程都修改这个引用会导致竞争状态出现,但从结果来看是正常的,说明 Clojure 引擎在执行时会自动解决这个问题。

    41610

    (cljsrun-at (JSVM. :browser) 命名空间就这么简单)

    我们没可能只调用cljs.core的成员吧,那到底如何引入其他命名空间呢?下面我们一一道来!...'(println "i-am-macro1")) (defmacro i-am-macro2 [] '(println "i-am-macro2"))  由于macro是在编译期展开为列表,然后在运行时解析列表...重置clojure内置的symbol  我们知道默认情况下会自动注入cljs.core的成员到当前命名空间中,因此我们可以直接使用+、-等函数。...如果此时我们自定义一个名为+的函数,那么就会让下次要使用加法函数时则需要写成cljs.core/+,这样总感觉不太好。那么我们可以借助:refer-clojure来重置这些内置symbol了。...如 (require 'clojure.data) (require '[clojure.set :as s]) 最佳实践 根据clojure-style-guide描述优先级别如下: :require

    81950
    领券