Clojure入门

本文介绍了Clojure编程语言的基础知识,包括语法形式、数据类型如数字、字符串、映射和向量的操作,条件控制结构如if、when,以及变量定义、数据结构的创建与访问等。此外还讲解了符号和命名规则、函数定义与使用、匿名函数和函数体返回值等内容。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

语法

参考

形式/Forms

  1. 数据:nubmbers,strings,maps,vectors
  2. 操作

数据:

1
“a string”
[“a” “vector” “of” “strings”]

操作:由( )规范

(operator operand1 operand2 … operandn)

例子:

(+ 1 2 3)
; => 6
(str “It was the panda ” “in the library ” “with a dust buster”)
; => “It was the panda in the library with a dust buster”

控制(control flow)

if

格式:

(if boolean-form
then-form
optional-else-form)

例子:

(if true
“abra cadabra”
“hocus pocus”)
; => “abra cadabra”

一个分支只能有一个表达式(form/expression)
如果要写多个form,则需要do

do

示例:

(if true
(do (println “Success!”)
“abra cadabra”)
(do (println “Failure :(“)
“hocus pocus”))
; => Success!
; => “abra cadabra”

when

是if和do的组合,但没有else

(when true
(println “Success!”)
“abra cadabra”)
; => Success!
; => “abra cadabra”

定义变量(def)

(def failed-protagonist-names
[“Larry Potter”
“Doreen the Explorer”
“The Incredible Bulk”])

数据结构

nil, true, false, Truthiness, Equality

nil : 相当于null,也代表false,除了nil和false之外,其他值都当做true

(nil? 1)
; => false
(nil? nil)
; => true
(= 1 1)
; => true
(= nil nil)
; => true
(= 1 2)
; => false

numbers

string

只能用双引号表示,连接只能用str函数

(def name “Chewbacca”)
(str “\”Uggllglglglglglglglll\” - ” name)
; => “Uggllglglglglglglglll” - Chewbacca

map

创建

;; An empty map
{}

;; “:a”, “:b”, “:c” are keywords and we’ll cover them in the next section
{:a 1
:b “boring example”
:c []}

;; Associate “string-key” with the “plus” function
{“string-key” +}

;; Maps can be nested
{:name {:first “John” :middle “Jacob” :last “Jingleheimerschmidt”}}

用函数创建

(hash-map :a 1 :b 2)
; => {:a 1 :b 2}
读取key
(get {:a 0 :b 1} :b)
; => 1
(get {:a 0 :b {:c “ho hum”}} :b)
; => {:c “ho hum”}

(get {:a 0 :b 1} :c)
; => nil

; 指定默认为空的返回值

(get {:a 0 :b 1} :c “UNICORNS”)
; => “UNICORNS”

get-in读取内嵌map

(get-in {:a 0 :b {:c “ho hum”}} [:b :c])
; => “ho hum

vector

;; Here’s a vector literal
[3 2 1]

;; Here we’re returning an element of a vector
(get [3 2 1] 0)
; => 3

;; Another example of getting by index. Notice as well that vector
;; elements can be of any type and you can mix types.
(get [“a” {:name “Pugsley Winterbottom”} “c”] 1)
; => {:name “Pugsley Winterbottom”}

用函数创建:
(vector “creepy” “full” “moon”)
; => [“creepy” “full” “moon”]

添加:

(conj [1 2 3] 4)
; => [1 2 3 4]

list

;; Here’s a list - note the preceding single quote
‘(1 2 3 4)
; => (1 2 3 4)
;; Notice that the REPL prints the list without a quote. This is OK,
;; and it’ll be explained later.

;; Doesn’t work for lists
(get ‘(100 200 300 400) 0)

;; This works but has different performance characteristics which we
;; don’t care about right now.
(nth ‘(100 200 300 400) 3)
; => 400

创建:

(list 1 2 3 4)
; => (1 2 3 4)

添加:

(conj ‘(1 2 3) 4)
; => (4 1 2 3)

set

;; Literal notation
#{“hannah montanna” “miley cyrus” 20 45}
;; If you try to add :b to a set which already contains :b,
;; the set still only has one :b
(conj #{:a :b} :b)
; => #{:a :b}
;; You can check whether a value exists in a set
(get #{:a :b} :a)
; => :a
(:a #{:a :b})
; => :a
(get #{:a :b} “hannah montanna”)
; => nil

用函数创建:

(set [3 3 3 4 4])
; => #{3 4}

;; 3 exists in vector
(get (set [3 3 3 4 4]) 3)
; => 3

;; but 5 doesn’t
(get (set [3 3 3 4 4]) 5)
; => nil

sorted-set

(sorted-set :b :a :c)
; => #{:a :b :c}

Symbols and Naming

Symbol :可以理解为形参

(def failed-movie-titles [“Gone With the Moving Air” “Swellfellas”])

quoting

引用,即symbol本身,而不是symbol代表的value

‘failed-protagonist-names
; => failed-protagonist-names
;; 获取变量值
(eval ‘failed-protagonist-names)
; => [“Larry Potter” “Doreen the Explorer” “The Incredible Bulk”]

(first ‘failed-protagonist-names)
; => Throws exception!

(first [‘failed-protagonist-names ‘failed-antagonist-names])
; => failed-protagonist-names

‘(failed-protagonist-names 0 1)
; => (failed-protagonist-names 0 1)

(first ‘(failed-protagonist-names 0 1))
; => failed-protagonist-names

(second ‘(failed-protagonist-names 0 1))
; => 0

Simplicity

Clojure 设计哲学:

It is better to have 100 functions operate on one data structure
than 10 functions on 10 data structures.

– Alan Perlis

故clojure没有类的概念,通常使用built-in数据结构

Functions

定义函数表达式:返回的也是函数

;; Return value of “or” is first truthy value, and + is truthy,or是函数,参数是 +,-,因为除了nil和false是false以外,任何其他值都为true,故返回了+,而+ 也代表了函数,故这个一个函数表达式,返回了一个代表+ 运算的函数
(or + -)
;;所以如下代表了求和操作
((or + -) 1 2 3)
; => 6

;;相同的,可以通过and来实现相同的功能
;; Return value of “and” is first falsey value or last truthy value.
;; + is the last truthy value
((and (= 1 1) +) 1 2 3)

;; 通过first实现相同的功能
;; Return value of “first” is the first element in a sequence
((first [+ 0]) 1 2 3)

map 函数,将 任意函数,应用于集合上

;; The “inc” function increments a number by 1
(inc 1.1)
; => 2.1

;; 注意返回的不是vector
(map inc [0 1 2 3])
; => (1 2 3 4)

定义函数 (defn)

(defn too-enthusiastic
“(docstring) Return a cheer that might be a bit too enthusiastic”
[name]
(str “OH. MY. GOD! ” name ” YOU ARE MOST DEFINITELY LIKE THE BEST ”
“MAN SLASH WOMAN EVER I LOVE YOU AND WE SHOULD RUN AWAY TO SOMEWHERE”))

(too-enthusiastic “Zelda”)
; => “OH. MY. GOD! Zelda YOU ARE MOST DEFINITELY LIKE THE BEST MAN

函数重载

(defn multi-arity
;; 3-arity arguments and body
([first-arg second-arg third-arg]
(do-things first-arg second-arg third-arg))
;; 2-arity arguments and body
([first-arg second-arg]
(do-things first-arg second-arg))
;; 1-arity arguments and body
([first-arg]
(do-things first-arg)))

传入可变参数

(defn codger-communication
[whippersnapper]
(str “Get off my lawn, ” whippersnapper “!!!”))

(defn codger
[& whippersnappers] ;; the ampersand indicates the “rest-param”
(map codger-communication whippersnappers))

(codger “Billy” “Anne-Marie” “The Incredible Bulk”)
; =>
; (“Get off my lawn, Billy!!!”
; “Get off my lawn, Anne-Marie!!!”
; “Get off my lawn, The Incredible Bulk!!!”)

Destructuring

;; Return the first element of a collection
(defn my-first
[[first-thing]] ; Notice that first-thing is within a vector
first-thing)

(my-first [“oven” “bike” “waraxe”])
; => “oven”

等价于:

(defn my-other-first
[collection]
(first collection))
(my-other-first [“nickel” “hair”])
; => “nickel”

传入map,:lat, :lng作为key,lat,lng为name

(defn announce-treasure-location
[{lat :lat lng :lng}]
(println (str “Treasure lat: ” lat))
(println (str “Treasure lng: ” lng)))
(announce-treasure-location {:lat 28.22 :lng 81.33})
; =>
; Treasure lat: 28.22
; Treasure lng: 81.33

等价于:

;; Works the same as above.
(defn announce-treasure-location
[{:keys [lat lng]}]
(println (str “Treasure lat: ” lat))
(println (str “Treasure lng: ” lng)))

获取map本身,通过as

;; Works the same as above.
(defn receive-treasure-location
[{:keys [lat lng] :as treasure-location}]
(println (str “Treasure lat: ” lat))
(println (str “Treasure lng: ” lng))

;; One would assume that this would put in new coordinates for your ship
(steer-ship! treasure-location))

函数体(function body)

返回最后一行

(defn illustrative-function
[]
(+ 1 304)
30
“joe”)
(illustrative-function)
; => “joe”

匿名函数

;; 用fn创建
;;This looks a lot like defn, doesn’t it?
(fn [param-list]
function body)

;; Example
(map (fn [name] (str “Hi, ” name))
[“Darth Vader” “Mr. Magoo”])
; => (“Hi, Darth Vader” “Hi, Mr. Magoo”)

;; Another example
((fn [x] (* x 3)) 8)
; => 24
;; 为匿名函数取名
(def my-special-multiplier (fn [x] (* x 3)))
(my-special-multiplier 12)
; => 36

# 方式,更紧凑的实现方式

;; Whoa this looks weird.
#(* % 3)
;; Apply this weird looking thing
(#(* % 3) 8)
; => 24
;; Another example
(map #(str “Hi, ” %)
[“Darth Vader” “Mr. Magoo”])
; => (“Hi, Darth Vader” “Hi, Mr. Magoo”)


【基于QT的调色板】是一个使用Qt框架开发的色彩选择工具,类似于Windows操作系统中常见的颜色选取器。Qt是一个跨平台的应用程序开发框架,广泛应用于桌面、移动和嵌入式设备,支持C++和QML语言。这个调色板功能提供了横竖两种渐变模式,用户可以方便地选取所需的颜色值。 在Qt中,调色板(QPalette)是一个关键的类,用于管理应用程序的视觉样式。QPalette包含了一系列的颜色角色,如背景色、前景色、文本色、高亮色等,这些颜色可以根据用户的系统设置或应用程序的需求进行定制。通过自定义QPalette,开发者可以创建具有独特视觉风格的应用程序。 该调色板功能可能使用了QColorDialog,这是一个标准的Qt对话框,允许用户选择颜色。QColorDialog提供了一种简单的方式来获取用户的颜色选择,通常包括一个调色板界面,用户可以通过滑动或点击来选择RGB、HSV或其他色彩模型中的颜色。 横渐变取色可能通过QGradient实现,QGradient允许开发者创建线性或径向的色彩渐变。线性渐变(QLinearGradient)沿直线从一个点到另一个点过渡颜色,而径向渐变(QRadialGradient)则以圆心为中心向外扩散颜色。在调色板中,用户可能可以通过滑动条或鼠标拖动来改变渐变的位置,从而选取不同位置的颜色。 竖渐变取色则可能是通过调整QGradient的方向来实现的,将原本水平的渐变方向改为垂直。这种设计可以提供另一种方式来探索颜色空间,使得选取颜色更为直观和便捷。 在【colorpanelhsb】这个文件名中,我们可以推测这是与HSB(色相、饱和度、亮度)色彩模型相关的代码或资源。HSB模型是另一种常见且直观的颜色表示方式,与RGB或CMYK模型不同,它以人的感知为基础,更容易理解。在这个调色板中,用户可能可以通过调整H、S、B三个参数来选取所需的颜色。 基于QT的调色板是一个利用Qt框架和其提供的色彩管理工具,如QPalette、QColorDialog、QGradient等,构建的交互式颜色选择组件。它不仅提供了横竖渐变的色彩选取方式,还可能支持HSB色彩模型,使得用户在开发图形用户界面时能更加灵活和精准地控制色彩。
标题基于Spring Boot的二手物品交易网站系统研究AI更换标题第1章引言阐述基于Spring Boot开发二手物品交易网站的研究背景、意义、现状及本文方法与创新点。1.1研究背景与意义介绍二手物品交易的市场需求和Spring Boot技术的适用性。1.2国内外研究现状概述当前二手物品交易网站的发展现状和趋势。1.3论文方法与创新点说明本文采用的研究方法和在系统设计中的创新之处。第2章相关理论与技术介绍开发二手物品交易网站所涉及的相关理论和关键技术。2.1Spring Boot框架解释Spring Boot的核心概念和主要特性。2.2数据库技术讨论适用的数据库技术及其在系统中的角色。2.3前端技术阐述与后端配合的前端技术及其在系统中的应用。第3章系统需求分析详细分析二手物品交易网站系统的功能需求和性能需求。3.1功能需求列举系统应实现的主要功能模块。3.2性能需求明确系统应满足的性能指标和安全性要求。第4章系统设计与实现具体描述基于Spring Boot的二手物品交易网站系统的设计和实现过程。4.1系统架构设计给出系统的整体架构设计和各模块间的交互方式。4.2数据库设计详细阐述数据库的结构设计和数据操作流程。4.3界面设计与实现介绍系统的界面设计和用户交互的实现细节。第5章系统测试与优化说明对系统进行测试的方法和性能优化的措施。5.1测试方法与步骤测试环境的搭建、测试数据的准备及测试流程。5.2测试结果分析对测试结果进行详细分析,验证系统是否满足需求。5.3性能优化措施提出针对系统性能瓶颈的优化建议和实施方案。第6章结论与展望总结研究成果,并展望未来可能的研究方向和改进空间。6.1研究结论概括本文基于Spring Boot开发二手物品交易网站的主要发现和成果。6.2展望与改进讨论未来可能的系统改进方向和新的功能拓展。
1. 用户与权限管理模块 角色管理: 学生:查看个人住宿信息、提交报修申请、查看卫生检查结果、请假外出登记 宿管人员:分配宿舍床位、处理报修申请、记录卫生检查结果、登记晚归情况 管理员:维护楼栋与房间信息、管理用户账号、统计住宿数据、发布宿舍通知 用户操作: 登录认证:对接学校统一身份认证(模拟实现,用学号 / 工号作为账号),支持密码重置 信息管理:学生完善个人信息(院系、专业、联系电话),管理员维护所有用户信息 权限控制:不同角色仅可见对应功能(如学生无法修改床位分配信息) 2. 宿舍信息管理模块 楼栋与房间管理: 楼栋信息:名称(如 "1 号宿舍楼")、层数、性别限制(男 / 女 / 混合)、管理员(宿管) 房间信息:房间号(如 "101")、户型(4 人间 / 6 人间)、床位数量、已住人数、可用状态 设施信息:记录房间内设施(如空调、热水器、桌椅)的配置与完好状态 床位管理: 床位编号:为每个床位设置唯一编号(如 "101-1" 表示 101 房间 1 号床) 状态标记:标记床位为 "空闲 / 已分配 / 维修中",支持批量查询空闲床位 历史记录:保存床位的分配变更记录(如从学生 A 调换到学生 B 的时间与原因) 3. 住宿分配与调整模块 住宿分配: 新生分配:管理员导入新生名单后,宿管可按专业集中、性别匹配等规则批量分配床位 手动分配:针对转专业、复学学生,宿管手动指定空闲床位并记录分配时间 分配结果公示:学生登录后可查看自己的宿舍信息(楼栋、房间号、床位号、室友列表) 调整管理: 调宿申请:学生提交调宿原因(如室友矛盾、身体原因),选择意向宿舍(需有空位) 审批流程:宿管审核申请,通过后执行床位调换,更新双方住宿信息 换宿记录:保存调宿历史(申请人、原床位、新床位、审批人、时间) 4. 报修与安全管理模块 报修管理: 报修提交:学生选择宿舍、设施类型(如 "
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值