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

Clojure问号箭头宏

是Clojure编程语言中的一种特殊宏,用于进行条件判断和处理。它的语法形式为?->,可以简化对嵌套结构的属性或方法的访问和调用。

该宏的作用是在访问嵌套结构时,避免因为中间某个属性或方法为nil而导致的空指针异常。它会自动检查每个属性或方法的返回值是否为nil,如果不为nil,则继续访问下一个属性或方法,直到最后一个属性或方法。

使用问号箭头宏可以提高代码的可读性和简洁性,减少了繁琐的空指针检查代码的编写。它在处理复杂的嵌套结构时特别有用,例如处理JSON数据、数据库查询结果等。

以下是一个示例代码,演示了如何使用Clojure问号箭头宏:

代码语言:txt
复制
(def data {:user {:name "John"
                  :address {:city "New York"
                            :zipcode "12345"}}})

(let [city (-> data :user :address :city)]
  (println city))

在上述代码中,我们使用问号箭头宏->来访问嵌套结构中的属性。首先,我们从data中获取:user属性,然后再从:user中获取:address属性,最后获取:address中的:city属性。如果任何一个中间属性为nil,整个表达式的结果将为nil。

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

请注意,以上推荐的腾讯云产品仅供参考,具体选择应根据实际需求进行评估和决策。

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

相关·内容

Clojure 学习入门(11)—— macro

clojure macro在运行之前机械展开,定义相当于给语言增加新特性,写的*原则*:  能写成函数就不要用(因为写没有写函数简单直观,容易写错,需要先在 REPL 中测试一番) ...只有不得不用时才用(性能要求高时比函数调用快,或者需要“代码数据”相互转换)  精心设计的调用比函数调用更 DSL(如实现控制结构、传递 Java方法)  与函数 ;; 正确写法 (defmacro...10 (+ 5 2)) (println (macroexpand-1 '(op 5 + 2 * 10))) ;; (* 10 (+ 5 2)) (println (clojure.walk...;; 2 (println (macroexpand-1 '(op2 5 + 2 * 10))) ;; 2 (println (clojure.walk...2 * 10) (println (macroexpand-1 '(op3 5 + 2 * 10))) ;; (op3 5 + 2 * 10) (println (clojure.walk

95820

clojure基础入门(一)

函数式编程中以函数为第一类对象,其小括号后面第一个元素被Clojure解释器当成一个函数或,其后面的都会被当成参数,如上"hello world"是被当成参数传入str函数进行输出。...函数 clojure中以函数为第一类对象,其小括号后面第一个元素被Clojure解释器当成一个函数或,其后面的都会被当成参数。...注意if是不是函数或,而是叫做special form(特殊形式),而且没有else,用空白或换行即表示else,不用显式return,clojure会将最后一个表示的值作为函数的返回值。...clojure中(lisp习惯)有个规定:对于判断功能的函数,函数名后面都有一个“?”号。所以只要看到后面带问号的函数名,就知道这一定是一个判断语句。 user=> (fn?...(macro)           Clojure中几乎所有的函数和都是用Clojure代码实现的,关于后面再说。

1.5K30

clojure基础入门(一)

函数式编程中以函数为第一类对象,其小括号后面第一个元素被Clojure解释器当成一个函数或,其后面的都会被当成参数,如上"hello world"是被当成参数传入str函数进行输出。...函数 clojure中以函数为第一类对象,其小括号后面第一个元素被Clojure解释器当成一个函数或,其后面的都会被当成参数。...注意if是不是函数或,而是叫做special form(特殊形式),而且没有else,用空白或换行即表示else,不用显式return,clojure会将最后一个表示的值作为函数的返回值。...clojure中(lisp习惯)有个规定:对于判断功能的函数,函数名后面都有一个“?”号。所以只要看到后面带问号的函数名,就知道这一定是一个判断语句。 user=> (fn?...(macro)           Clojure中几乎所有的函数和都是用Clojure代码实现的,关于后面再说。

1.3K40

Clojure与LispClojure与Lisp

Lisp的 Lisp语言刚出现的时候,它的思想与其他编程语言大相径庭。后者的设计思想主要由50年代后期的硬件决定。随着时间流逝,流行的编程语言不断更新换代,语言设计思想逐渐向Lisp靠拢。...最常用的做法就是使用。 术语""在Lisp语言中,与其他语言中的意思不一样。Lisp无所不包,它既可能是某样表达式的缩略形式,也可能是一种新语言的编译器。...如果你想真正地理解Lisp语言,或者想拓宽你的编程视野,那么你必须学习。...Clojure简介 运行于Java虚拟机的List方言Clojure....直接调用Java方法,不去发明一套新的调用语法,努力规避Java语言中繁琐的地方(doto,箭头等等)。

1.8K30

Clojure 运行原理之编译器剖析

为了更加具体描述 Clojure 运行原理,会分两篇文章来介绍。 本文为第一篇,涉及到的主要内容有:编译器工作流程、Lisp 的机制。...源程序 → 分词 → 构造 S-表达式,由 LispReader.java 类实现 扩展 → 语义分析 → 生成 JVM 字节码,由 Compiler.java 类实现 上图给出了不同阶段的输入输出...return macroexpand(exf); return form; } macroexpand1 函数进行主要的扩展工作,它会调用isMacro判断当前Var是否为一个,...Clojure 里面通过defmacro函数创建,它会调用var的setMacro函数来设置元信息macro为true。...编译器的实现,加深了对 eval-apply 循环的理解,还有一点就是揭开了的真实面貌,之前一直认为是个很神奇的东西,其实它只不过是编译时运行的函数而已,输入与输出的内容既是构成程序的数据结构,同时也是程序内在的

94930

Python:ipython简介及与原生python shell比价

:使用编辑器打开当前函数编辑 %save:把某些历史记录保存到文件 %debug:激活debug程序 等等,后面会讲到 (6)ipython有很多快捷键 (7)ipython的扩展系统...、storemagic持久化、变量、别名;以及autoreload自动重载等功能; 二、ipython的内省 ipython相较于原生的python,提供了更加强大的内省功能,所谓内省,也称之为内视...object:两个问号显示详细信息,如果是类或者是函数,还会显示源代码。即将问号放在前面和后面都可以。 通配符*匹配:如numpy.load? 这会显示所有的包含有load的函数,numpy....这会显示所有以sort结尾的函数 三、ipython快捷键 下面介绍一下第一个和第二个快捷键,比如有如下代码: Ctrl-P 或上箭头键 后向搜索命令历史中以当前输入的文本开头的命令 Ctrl-N...:当我们想要查看某一命令的详细信息,我们可以使用同前面类似的方法,在魔术命令后面添加一个或者是两个问号??来查看详细信息。

9110

Clojure 开发那些事

Clojure —— 新世纪的 Lisp 方言,相信大多数同学多多少少都听过,毕竟有个杀手级应用 Storm,但是真正去写 Clojure 的同学估计不多,国内也罕见哪个公司招 Clojure 程序员。...Clojure编程,这本书应该毋庸置疑是新手的必须书 除了看书外,下面的文档写的也非常 newbie-friendly,推荐大家多去逛逛: http://clojure-doc.org/,对 Clojure...Clojure 的宿主语言现在主要有两个:一个是最多最多的的基于 JVM 的;另一个是基于微软 .NET 的 Clojure-CLR,现在还有一个发展迅猛的 ClojureScript,可以将 Clojure...Emacs + Cider 的组合相比 Intellj + Cursive 最大的优势就是对的支持,Cider 提供了对展开的快捷键,但在 Cursive 中我没找到,不过也是比较高级的功能,初学者应用用不到...Intellj Debug Mode 借助于 IDE 的优势,我们可以打断点,一步一步调试,但是 Cursive 对的支持比较有限,目前出来把展开外,没找到好的调试的好方法。

1.5K20

Clojure 学习入门(7)—— 连接mysql

Clojure的contrib包中实现了对现有JDBC的封装,在wiki上有连接,该页面上包含了对不同的数据库的连接方法和基本的操作,但是这个页面上没有提供足够的信息,足够一个初学者能够使用Clojure...本文中我们将利用Clojure和Lein工具,简介一下做开发的基础。当然网上也有非常多对Clojure的SQL操作进行封装的库,我们这里没有使用。...接着,在需要使用sql库的地方要导入这些库 在ns中加载如下内容:(:use [clojure.contrib.sql :as sql :only ()]),这样在本文件中就可以直接使用sql作为前缀.../clojure "1.5.1"] [org.clojure/java.jdbc "0.0.6"] [org.clojure/clojure-contrib...注:所有的sql操作都需要在with-connection下包裹着 参考推荐: Clojure SQL 基础 Clojure 连接mysql Connecting Clojure and MySQL

1.1K20

使用 ClojureScript 开发浏览器插件的过程与收获

对于 Clojure,我目前在 sf 上有一套视频课程,供参考。 为了方便大家使用 cljs 开发插件,我整理了一份模板,供大家参考。...感兴趣的可以看看这两者之间的比较: Why Re-frame instead of Om Next,以及 Reddit 上的讨论 A rant on Om Next 坑 cljs 里面加载的机制有别于...Clojure,一般需要单独把定义在一个文件里面,然后在 cljs 里面用(:require-macros [my.macros :as my]) 这样的方式去引用,而且定义的文件名后缀必须是 clj...由于编译与 cljs 编程在不同的时期,所以如果写错了,就需要把 repl 杀掉重启来把新的 feed 给 cljs,这点也比较痛苦,因为 repl 的启动速度实在是有些慢。...这一点在 Clojure 里面虽然也存在,但是 Clojure 里面一般 repl 开了就不关了,直到电脑重启。

68430

几分钟内学习 Clojure

Clojure源码托管在:github 在线练习编译环境: himera learnclojure.clj 示例: ; 分号作为注释的开始 ; Clojure 用一种把元素用括号括起来的像列表一样的方式来书写...,元素之间用空格隔开 ; clojure 解释器会把第一个元素当做是函数或者调用,其他的都作为参数 ; 下面这个函数用于设置当前的命名空间 (ns test) ; 更多基本的例子: ; str 函数会用它所有的参数创造一个字符串...(class [1 2 3]); => clojure.lang.PersistentVector (class '(1 2 3)); => clojure.lang.PersistentList ;...命名空间包含更多的函数 ; 一些有用的形式 ;;;;;;;;;;;;;;;;; ; clojure中的逻辑结构都是, 看起来也没什么不同 (if false "a" "b") ; => "b"...:only [intersection]]) ; 使用reqire来导入一个模块 (require 'clojure.string) ; 使用/从一个模块中调用函数 (clojure.string

1.6K40

Clojure 学习入门(18)—— 数据类型

Clojure的类型既简单又复杂。Clojure的本身只有少量不同的类型,而且Clojure不是面向对象语言,它本身并不支创建新的用户自定义类型。一般来说,这让事情非常简单。...(re-pattern " [a-zA-Z]*") -> #"[a-zA-Z]*" 也可以使用读取来直接用文本的方式输入正则表达式:在字符串前使用#符号。...(not (== 5 5)) -> false and and接受任意数量参数,如果每个逻辑计算结果都为true则返回true,反之为false。...(and (== 5 5) ( true or or接受任意数量参数,如果参数逻辑结果有一个或多个为true则返回true,反之为false。...请阅读12章里在里使用quote来实现复杂的元编程的详细讨论。 ---- 列表是以单向链接列表的形式来实现的,在这一点上有利有弊。

2.2K10
领券