【clojure】入门篇-01

news2024/9/24 5:24:57

一、环境的配置

1.java环境配置

clojureScript 需要java环境的配置需要下载jdk进行java环境变量配置

下载官网

java环境变量的配置教程

2.Leningen环境配置

1.下载.bat文件内容

2.配置环境变量

2.8.3及以上内容进行配置

lein教程

2.使用vscode

vscode官网

下载插件 Calva:Clojure & ClojureSC

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ynkUFwZg-1692547087648)(C:\Users\24955\AppData\Roaming\Typora\typora-user-images\image-20230809085620838.png)]

二、数据类型

1. hello world

扩展名.clj

如此便可以在helloWorld.clj中编写第一个clojure程序了!

(ns helloworld) //ns的命令是指命名空间,下载完lein之后创建clj项目便会自带该句(ps)
(+ 1 1) //1+1=,按住ctrl+shift,该句会出现=>2

2.clojure中的数据结构

;; 一、基本数据类型
(type 1.1) ;; clojure.lang.Double

(type 1/3) ;; clojure.lang.Ratio

(type 20) ;;clojure.lang.Long

(type true) ;;clojure.lang.Boolean

(type \c) ;;clojure.lang.Character

(type "hello") ;;clojure.lang.String

(type 'a) ;;clojure.lang.Symbol
(def a 1)
(type #'a)

(type (keyword '0')) ;;clojure.lang.Keyword

;; 二、集合数据类型
2.1 list
(type '(a b c))

(typ (list a b c))

2.2 Vector
(type [1 2 3])

(type (vector 1 2 3))

2.3 Queue

2.4 ArrayMap
(type {:a 1 :b2})

2.5 HashMap
(type (hash-map :a 1 :b 2))

2.6 Set
(type #{:a :b})


三、Clojure中的语句

1.定义一个变量

;; 定义一个symbol的a设置的值为hello,a值不可变
(def a "hello")
;; 定义局部的,直接返回了a
(let [a "hello"]
    a)

2.条件语句

if

;; 判断条件
(if (empty? a)
  :empty
  (do
    (prn "not empty ...")
    :not-empty))
;;do 某一个距离或者某一个分支有一个副作用返回的是最后一个值,其他的都downlock

单分支

(when-not (empty? a)
    (prn "not-empty")
    :hahahaha)

case

(case a
    "hello" :hi
    "good" :nihao
    :not-match)
;;与a相等输出后面的值,都不匹配输出not-match

cond

(cond 
    (= a "hello") :hello
    (= (apply str (reverse a) )) "olleh" :resversed-hello)
;;是否等于a,等于hello,都不相等输出else中的值

;;reverse 输出内容有\n需要进行拼接

clojure中,除了nil、false所有都是true

四、定义一个函数

ps:定义之后若要使用该函数名称,需要先执行一遍该定义的内容

;; 3.定义一个函数
;; 函数、后面跟的是一个参数列表,
;;一个函数出现在列表的第一个元素位置的时候会被求值,这样就执行了这个元素
(fn [] "hello world")
;;给函数起一个名字
(def hello (fn [] "hello world"))

;;通常使用 defn 函数名 参数列表 函数体
(defn hello [] "hello world")

1.匿名函数

;; 有一种函数定义了之后只在本地用别处不用
;; #(函数名 函数体 参数(第一个参数就是%1))
#(str "hello" %1)
;; 进行使用,将Kevin作为参数传入
(#(str "hello" %1) "Kevin")

接受三种不同类型的参数,第一个为空,第二个是一个参数、第三个是多个参数(相当于java中的函数重载)

2.函数的解构

;;定义一个函数,接收一个map
;;对此人说hi,name为keyword,keyword可以当函数用
(defn hi [person]
    (str "Hi" [:name person]))
(hi {:name "kevin" :title "Major"}) =>"Hi Kevin"

;;解构
(defn hi [{name :name}]
    (str "Hi" name))
(hi {:name "kevin" :title "Major"}) =>"Hi Kevin"

3.多参数函数

;; 第一个未带参数,直接返回hello world
;; 第二个 ([name] "hello" name)普通函数中需要return出去变量的内容,此句并没有return,所以要str拼接一下,且换行写
(defn yoho 
    ([] "hello world")
    ([name] 
     (str "hello" name)))

(yoho) =>"hello world"

(yoho "Kevin") =>"hello Kevin"

五、clojure中的数据结构

1.list

;;clojure中的数据结构是不可变的,一旦定义之后不可以改变
(def x (list 1 2 3))

;;向里面增加一个新元素
(cons 0 x) =>(0 1 2 3)

;;原始x中的内容
x => (1 2 3)

;;有顺序的取值
(first x) =>1

(last x) =>3

;;nth取任意元素
(nth x 0)=>1

;;最高效的把一个元素加入到数据结构,在list链表中插入头部的效率最高
(conj x 0) =>(0 1 2 3)


2.Vector

;;clojure中的数据结构是不可变的,一旦定义之后不可以改变
(def x [1 2 3])

;;向里面增加一个新元素
(cons 0 x) =>(0 1 2 3)

;;原始x中的内容
x => (1 2 3)

;;有顺序的取值
(first x) =>1

(last x) =>3

;;nth取任意元素
(nth x 0)=>1

;;注意conj在该数据结构中与在list中不同
(conj x 0)=>[1 2 3 0]

3.map

;;定义一个map
(def m ({:a 1 :b 2}))

;;建立连写
(assoc m :c 3)=>{:a 1 :b 2 :c 3}

;;对于 m来说它的值仍然是{:a 1 :b 2}

;;assoc-in a的结构是一个嵌套结构,要修改a中b的值为10 
(assoc-in {:a {:b 1}} [:a :b] 10)
;; 在a中新增一个元素c
(assoc-in {:a {:b 1}} [:a :c] 10) =>{:a {:b 1 :c 10}}

;;update-in 也是用来更新map中的数据
;; inc函数,b原来指向的函数+1,得到b = 2 
(update-in {:a {:b 1}} [:a :b] inc) =>{:a {:b 2}}

;;要获得map中的值,可以用keyword直接获得,m中的a值=1
(:a m)
;;等价于使用get中map的值
(get m :a)

对于map常见的几种类型

;; hash
(hash-map :a 1)

;;array
(array-map :b 2)

;;map本身的key-value是没有顺序的,如果非要有顺序可以使用sorted-map
(sorted-map :a 1 :b 2)

4.Set

;;定义一个set的数据结构
(def s #{1 2 3})

;;使用conj为set添加一个新值
;;注意set是无序的不一定会添加到哪里
(conj s 4)

;;使用contains判断set中是否含有某个值
(contains? s 9)

六、递归和高阶函数

1.递归函数

;; 定义一个sum'函数,接收一个total作为临时变量,接收一个数组vals
;;递归实际上就是数组为空,数组为空了就返回一个值total
;;当前数组不为空的时候就继续调用自己,sum'的值就是加上数组中的第一个值,拿掉加过的值
(defn sum' [total vals]
    (if (empty? vals)
        total
        (sum' (+ first vals)
              (rest vals))))
(sum' 0 [1 2 3 4])=>10

;;上述方法有一个total临时变量不太好
;;改为多参数的,第一个vals,希望调用有两个参数的sum'
;;定义两个参数的函数
(defn sum' 
    ([vals] (sum' 0 vals))
    ([total vals]
     (if (empty? vals)
         total
         (sum' (+ first vals)
               (rest vals)))))
(sum' [1 2 3 4])

递归优化

;;jvm限制,本地优化,必须给编译器或者显示器一些提示,不能使用函数名直接调用,使用recur
(defn sum' 
    ([vals] (sum' 0 vals))
    ([total vals]
     (if (empty? vals)
         total
         (recur (+ first vals)
               (rest vals)))))
(sum' [1 2 3 4])

定义sum函数,单参是需要的,多参是不需要的,递归点不一定是函数名,可以loop,只要loop开始就绑定做一个递归点

(defn sum'
    [vals]
    (loop [total 0
            vals vals]
        if (empty? vals)
        total
        (recur (+ total (first vals))
               (rest vals))))
(sum' (range 1000))

reduce

;; reduce接受三个参数,第一个接受一个函数,第二个接收一个初始值,第三个接收要处理的参数
(reduce (fn my-add [total val]
            (+ total val)) 0 [1 2 3 4])

;;将my-add函数拿出来
(defn my-add [total val]
    (+ total val))
(reduce my-add 0 [1 2 3 4])
;;可以将初始值省略
(reduce my-add [1 2 3 4])
;;等价于reduce中的加法
(reduce + [1 2 3 4])

2.高阶函数

reduce 是高阶函数中最普适的一个

;;过滤 是否是偶数
;;传递的是两个值,一直累计的结果,中间传入的value
;;先判断传入的值是否是偶数,如果是偶数acc就添加,如果不是就把acc返回
(defn filter-even [acc,val]
    if(even? val) (conj acc val) acc)
(reduce filter-even [] [1 2 3 4]) =>[2 4]

;;或者直接使用clojure函数
(filter even? [1 2 3 4])=>[2 4]

;;数组中的每个值加1
(defn map-inc [acc val]
    (conj acc (inc val)))
;; 返回数组的需要指定初始值
(reduce map-inc [] [1 2 3 4])
;;等价于
(map inc [1 2 3 4])
;;偶数和奇数分为两组
(defn group' [acc val]
    (if (even? val)
        (update-in acc [:even] #(conj % val))
        (update-in acc [:odd] #(conj % val))))
(reduce group' {} [1 2 3 4])=>{:odd (3 1), :even (4 2)}

;;相当于
(group-by (fn [val] (if (even? val) :even :odd))
          [1 2 3 4])

七、使用lein创建项目

在命令行中创建项目,注意项目名称大小写的问题

 lein new learnclj

目录:

目录内容
product.clj配置文件 dependencies:依赖
src/learnclj/core.clj文件主要内容

使用lein进行启动

启动之后,直接进行调用

在这里插入图片描述

添加main函数,执行lein run

main函数前面加-,指的是静态函数

lein run -m learnclj.core

在这里插入图片描述

可以在配置函数中添加

在这里插入图片描述

直接使用命令

lein run

产生同样效果

也可以编译成jar包,

在core.clj页面添加

使用命令

lein uberjar

target目录下有两个jar包

再执行

java -jar target/learnclj-0.1.0-SNAPSHOT-standalone.jar

在这里插入图片描述

同样可以出现如下效果

八、如何在clojure中引入一个库

在这里插入图片描述
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/935756.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SIP 协议路由规则详解

文章目录 SIP 路由关键字段SIP 路由图解 SIP 路由关键字段 SIP 协议实际上和 HTTP 类似,都是基于文本、可阅读的应用层协议,二者的不同之处在于 SIP 协议是有状态的。在 SIP 协议中,影响报文路由的相关字段如下表所示,总结起来如…

给微软.Net runtime运行时提交的几个Issues

前言 因为目前从事的CLRJIT,所以会遇到一些非常底层的问题,比如涉及到微软的公共运行时和即时编译器或者AOT编译器的编译异常等情况,这里分享下自己提的几个Issues。原文:微软.Net runtime运行时提交的几个Issues Issues 一.issues one 第一个System.Numerics.Vecto…

深度强化学习。介绍。深度 Q 网络 (DQN) 算法

马库斯布赫霍尔茨 一. 引言 深度强化学习的起源是纯粹的强化学习,其中问题通常被框定为马尔可夫决策过程(MDP)。MDP 由一组状态 S 和操作 A 组成。状态之间的转换使用转移概率 P、奖励 R 和贴现因子 gamma 执行。概率转换P(系统动…

SaaS多租户系统架构设计

前言:多租户是SaaS(Software-as-a-Service)下的一个概念,意思为软件即服务,即通过网络提供软件服务。SaaS平台供应商将应用软件统一部署在自己的服务器上,客户可以根据工作的实际需求,通过互联网…

万字长文解析AQS抽象同步器核心原理(深入阅读AQS源码)

AQS抽象同步器核心原理 在争用激烈的场景下使用基于CAS自旋实现的轻量级锁有两个大的问题: CAS恶性空自旋会浪费大量的CPU资源。在SMP架构的CPU上会导致“总线风暴”。 解决CAS恶性空自旋的有效方式之一是以空间换时间,较为常见的方案有两种&#xff…

ubuntu使用二进制安装mysql常见问题

一、安装mysql完毕后初始化失败 【/usr/local/mysql/bin】./mysqld --usermysql --basedir/usr/local/mysql --datadir/usr/local/mysql/data/ --initialize 输入命令:apt-get install libaio1 libaio-dev 二、初始化成功后重启服务失败 rootyanhong:/usr/local/…

4 hadoop集群配置案例

3&#xff09;配置集群 &#xff08;1&#xff09;核心配置文件&#xff0c;core-site.xml cd $HADOOP_HOME/etc/hadoopvim core-site.xml文件内容如下&#xff1a; <?xml version"1.0" encoding"UTF-8"?> <?xml-stylesheet type"text…

java八股文面试[多线程]——并发三大特性 原子 可见 顺序

AutomicInteger : volatile CAS 总线LOCK MESI 两个协议 TODO volatile的可见性和禁止重排序是怎么实现的&#xff1a; DCL场景&#xff1a; new操作会在字节码层面生成两个步骤&#xff1a; 分配内存、调用构造器 然后把引用赋值给singleton 不加volatile则会发生指令重…

Windows下MATLAB调用Python函数操作说明

MATLAB与Python版本的兼容 具体可参看MATLAB与Python版本的兼容 操作说明 操作说明请参看下面两个链接&#xff1a; 操作指南 简单说明&#xff1a; 我安装的是MATLAB2022a和Python3.8.6&#xff08;安装时请勾选所有可以勾选的&#xff0c;包括路径&#xff09;。对应版本安…

基于闪电连接过程算法优化的BP神经网络(预测应用) - 附代码

基于闪电连接过程算法优化的BP神经网络&#xff08;预测应用&#xff09; - 附代码 文章目录 基于闪电连接过程算法优化的BP神经网络&#xff08;预测应用&#xff09; - 附代码1.数据介绍2.闪电连接过程优化BP神经网络2.1 BP神经网络参数设置2.2 闪电连接过程算法应用 4.测试结…

基于阿基米德优化算法优化的BP神经网络(预测应用) - 附代码

基于阿基米德优化算法优化的BP神经网络&#xff08;预测应用&#xff09; - 附代码 文章目录 基于阿基米德优化算法优化的BP神经网络&#xff08;预测应用&#xff09; - 附代码1.数据介绍2.阿基米德优化优化BP神经网络2.1 BP神经网络参数设置2.2 阿基米德优化算法应用 4.测试结…

华为OD机试 - 最少数量线段覆盖 - 二叉树(Java 2023 B卷 100分 考试抽中题)

目录 一、题目描述二、输入描述三、输出描述四、解题思路四、Java算法源码五、效果展示1、输入2、输出3、说明4、复杂一点5、理性分析一下 华为OD机试 2023B卷题库疯狂收录中&#xff0c;刷题点这里 一、题目描述 给定坐标轴上的一组线段&#xff0c;线段的起点和终点均为整数…

第三讲,三维空间刚体运动

一个刚体在三维空间中的运动是如何描述的。我们当然知道这由一次旋转加一次平移组成。平移确实没有太大问题&#xff0c;但旋转的处理是件麻烦事。我们将介绍旋转矩阵、四 元数、欧拉角的意义&#xff0c;以及它们是如何运算和转换的。 1.向量&#xff0c;坐标系和旋转矩阵 点…

【LeetCode-中等题】19. 删除链表的倒数第 N 个结点

文章目录 题目方法一&#xff1a;节点加入集合找索引方法二&#xff1a;直接计算长度,然后找出要删除的节点的前一个节点方法三&#xff1a;栈方法四&#xff1a;前后双指针 题目 这题的关键在与两个点 一定要设置一个哑结点&#xff0c;防止删除第一个元素时&#xff0c;导致空…

C语言基础之——指针(下)

前言&#xff1a;本篇文章将继续讲解有关指针的剩余基础知识。 学无止境&#xff0c;一起加油叭&#xff01;&#xff01; 目录 一.指针运算 1.指针 - 整数 2.指针的关系运算 3.指针 - 指针 二.指针与数组 三.二级指针 四.指针数组 总结 一.指针运算 指针运算包括以下三…

Tableau可视化入门实践-2

目录 折线图1.导入excel文件数据2.建立折线图并添加标签 双轴折线图 折线图 1.导入excel文件数据 2.建立折线图并添加标签 双轴折线图 行标签拖进两个度量建立上下两个折线图 在第二个折线图纵轴&#xff0c;右键选择“双轴”

DiskCatalogMaker for Mac简单智能快速的磁盘管理工具

DiskCatalogMaker是一款Mac上的磁盘目录管理工具。它可以帮助用户快速创建和管理磁盘目录&#xff0c;方便查找和访问存储在磁盘上的文件和文件夹。它具有快速扫描和索引功能&#xff0c;生成详细的目录列表&#xff0c;支持关键字搜索和自定义标签。 此外&#xff0c;DiskCat…

k8s 查看加入主节点命令 k8s重新查看加入节点命令 k8s输入删除,重新查看加入命令 kuberadm查看加入节点命令

1. 使用kuberadm 安装成功后&#xff0c;clear清除了屏幕数据&#xff0c;加入命令无法查看&#xff0c;使用如下&#xff0c;重新查看node如何加入主节点命令&#xff1a; kubeadm token create --print-join-command --ttl 0 2.画圈的全部是&#xff0c;都复制&#xff0c;在…

反转链表00

题目链接 反转链表 题目描述 注意点 链表中节点的数目范围是 [0, 5000] 解答思路 迭代或递归解决本题 代码 方法一&#xff1a; // 迭代 class Solution {public ListNode reverseList(ListNode head) {if (head null || head.next null) {return head;}ListNode pre…

【原创】jmeter并发测试计划

bankQPS 创建线程组 设置并发参数 HTTP请求GET 添加HTTP请求 GET请求 查看结果树 HTTP请求 POST 添加HTTP请求 参数必须设置头信息格式&#xff1a; 添加HTTP头信息 查看结果树 可以选择&#xff0c;仅查看错误日志 汇总报告