MAL文档

MAL文档

    • 语法
      • 读取器宏
      • 特殊形式
    • 内置符号
    • 内置函数
      • 算数运算
      • 谓词
      • 字符串
      • 解释器
        • 读取
        • 求值
        • 打印
      • 原子
      • 序列操作
      • 字典
      • 元数据
      • 时间
      • 异常
      • FFI
    • 标准库
      • 符号
      • 函数

语法

  • 空白符 所有的空白符会被忽略
  • , 逗号也会被忽略
  • ; 以分号起始的内容直到行尾都被视为注释
  • 符号
    • 符号中不允许含有空白符及[]{}()'",;`诸特殊字符
    • 符号亦不得以~@^诸特殊字符开头
    • :开头的符号称为关键字,可以用作字典的键
    • 按照惯例,!结尾的符号表示副作用,?结尾的符号表示谓词
    • 符号中可以使用unicode字符(包括emoji)
  • 数字
    • 目前仅支持整数,尚不支持浮点数
  • 字符串
    • 有限的unicode支持

读取器宏

  • () / [] / {} / "" 列表/向量/字典/字符串
  • ' / ~ / ~@ / ` 引号/解引号/解引号并展平/反引号
  • @ 解原子引用
  • ^ 元数据

特殊形式

Lisp “specials” (or “special atoms”) which means that they are language level features and more specifically that the rest of the list elements (arguments) may be evaluated differently (or not at all) unlike the default apply case where all elements of the list are evaluated before the first element is invoked. Lists which contain a “special” as the first element are known as “special forms”. They are special because they follow special evaluation rules.

  • def! 定义符号
    (def! a b)
    
    定义ab,求值并返回b
    The ! suffix on symbols is used to indicate that this symbol refers to a function that mutates something else.
  • let* 定义块
    (let* (a1 b1 a2 b2 ...) body)
    
    body中,定义a1b1a2b2,… 且后方绑定可以引用前方绑定。
    最终求值并返回body.
  • do 顺序执行
    (do a1 a2 ... an)
    
    顺序执行a1 a2 ...,最终求值并返回an.
  • if 条件分支
    (if cond true_clause)
    (if cond true_clause false_clause)
    
    如果condnilfalse以外的其他值,求值并返回true_clause,否则求值并返回false_clause(如果存在)或nil.
  • fn* 匿名函数 / 闭包
    (fn* params body)
    (fn* (p1 p2 & rest) body)
    
    params为参数,body为函数体创建闭包并返回。可被直接调用或使用def!使其具名。&之后的参数将绑定到所有未绑定的实参。
  • quote / ' 引号
  • quasiquote / ` 反引号
  • unquote / ~ 解引号
  • splice-unquote / ~@ 解引号并展平
    (def! lst (quote (b c))) ;-> (b c)
    (quasiquote (a lst d)) ;-> (a lst d)
    (quasiquote (a (unquote lst) d)) ;-> (a (b c) d)
    (quasiquote (a (splice-unquote lst) d)) ;-> (a b c d)
    
  • quasiquoteexpand 展开反引号
    展开反引号至求值前的状态
  • defmacro! 定义宏
    (defmacro! a b)
    
  • macroexpand 展开宏
    完全展开宏至求值前的状态
  • try* / catch* 异常处理
    (try* a (catch* e b))
    

内置符号

  • true / false / nil
  • *ARGV* 参数列表

内置函数

算数运算

  • + / - / * / /
    以运算符连接诸参数并返回求值结果。
    对空参数列表,+ / - 返回0,* / / 返回1.
    对单参数,+ / * 返回其自身,- 返回其相反数,/ 返回其倒数。
  • = / < / <= / > / >=
    =外,其余比较运算仅对数字进行比较。
    = 可对任意对象进行比较。

谓词

  • nil? / true? / false? / symbol? / atom? / keyword? / vector? / sequential? / map? / list? / empty? / contains? / fn? / string? / number? / macro?

字符串

  • str 转普通字符串
    (str (list 1 2 "abc" "\"") "def")
    ;=> "(1 2 abc \")def"
    
    将诸参数转换为字符串,返回诸字符串拼接的结果,不转义特殊字符。
  • pr-str 转机读字符串
    (pr-str (list 1 2 "abc" "\"") "def")
    ;=> "(1 2 \"abc\" \"\\\"\") \"def\""
    
    将诸参数转换为字符串,返回诸字符串以空格拼接的结果,转义特殊字符。
  • symbol 从字符串创建符号

解释器

读取

  • read-string 读字符串
    (read-string "(1 2 (3 4) nil)")
    ;=>(1 2 (3 4) nil)(= nil (read-string "nil"))
    ;=>true(read-string "(+ 2 3)")
    ;=>(+ 2 3)(read-string "\"\n\"")
    ;=>"\n"(read-string "7 ;; comment")
    ;=>7
    
    读入机读字符串,返回内部表示(AST).
  • slurp 读文件内容
    读入指定文件,将文件内容返回为字符串。
  • readline 读取键盘输入
    输出提示符,并返回用户输入的字符串,如果读到EOF,返回nil.

求值

  • eval 求值
    (eval (read-string "(+ 2 3)"))
    ;=>5
    
    对内部表示(AST)进行求值并返回。

打印

  • println 普通打印
    (println (list 1 2 "abc" "\"") "def")
    ; (1 2 abc ") def
    ;=> nil
    
    不转义特殊字符并打印诸参数,返回nil.
  • prn 按原样打印
    (prn (list 1 2 "abc" "\"") "def")
    ; (1 2 "abc" "\"") "def"
    ;=> nil
    
    转义特殊字符并打印诸参数,返回nil.
    对机读字符串进行普通打印相当于对原字符串按原样打印,即println ∘ pr-str = prn.

原子

  • atom 创建原子
  • deref / @ 解原子引用
  • reset! 重置原子并返回重置值
  • swap! 更新原子并返回更新值
    (swap! myatom (fn* [x] (+ 1 x)))
    

序列操作

  • cons 将元素追加至序列头,返回列表
  • concat 拼接多个序列,返回列表
  • list / () 从参数创建列表
  • vector / [] 从参数创建向量
  • vec 转换序列到向量
  • count 返回序列元素个数
  • nth 返回序列的第n个元素
  • first 返回序列的首元素
  • rest 返回除去首元素后的序列
  • apply 以序列为参数调用函数
    (apply + 4 (list 5))
    ;=>9
    
    apply 至少需要两个参数,第一个为被调用函数,最后一个为序列,其他参数将与序列拼接,并以拼接结果调用函数。
  • map 对序列中的每一个元素应用函数并返回结果组成的序列
  • conj 向列表头或向量尾追加多个元素
  • seq 将序列或字符串转换为列表

字典

  • keyword / : 从字符串创建键
  • hash-map / {} 创建字典
  • assoc 向字典中追加键/值
    (assoc {:a 1 :b 2} :a 3 :c 1)
    
  • dissoc 从字典中删除键及其对应的值
    (dissoc hm3 "a" "b" "c")
    
  • get 从字典中查找键对应的值
  • keys 返回键的列表
  • vals 返回值的列表

元数据

  • with-meta / ^ 为函数/序列/字典追加元数据
  • meta 返回函数/序列/字典的元数据

时间

  • time-ms 返回自epoch(00:00:00 UTC January 1, 1970)以来经过的毫秒数

异常

  • throw 抛出异常

FFI

  • c-eval 对C语句求值

标准库

符号

  • *host-language* 宿主语言

函数

  • not 对谓词取反
  • load-file 加载并求值文件内容

  • cond 多条件分支语句
    展开为多个if级联。

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

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

相关文章

pytorch安装GPU版本 (Cuda12.1)教程: Windows、Mac和Linux系统下GPU版PyTorch(CUDA 12.1)快速安装

&#x1f337;&#x1f341; 博主 libin9iOak带您 Go to New World.✨&#x1f341; &#x1f984; 个人主页——libin9iOak的博客&#x1f390; &#x1f433; 《面试题大全》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33…

vscode设置java -Xmx最大堆内存

如果在vscode中直接运行java程序&#xff0c;想要改下每次运行的最大堆内存&#xff0c;按照如下修改 一、vscode安装java插件 当然前提是vscode在应用管理中已经安装了java语言的插件&#xff0c;Debugger for Java,如下图所示 二、CommandShiftP打开配置搜索框 三、搜索…

前端实现输入框实时搜索,【vue+el-input】

一般搜索都是调后端的接口&#xff0c;绑searchValue字段&#xff08;也有可能叫其他的字段名&#xff09;&#xff0c;通过后端的接口进行实时搜索 如果由前端自己实现搜索过滤的话也简单 1、input事件 <el-inputv-model"queryParams.searchValue"input"k…

dpdpdp

这里写目录标题 139. 单词拆分322. 零钱兑换300. 最长递增子序列120. 三角形最小路径和64. 最小路径和63. 不同路径 II5. 最长回文子串&#xff08;回文dp&#xff09;⭐97. 交错字符串⭐&#xff08;抽象成路径问题&#xff09;221. 最大正方形⭐ 139. 单词拆分 class Soluti…

代码随想录day8 | KMP 28.实现strStr() 459.重复的子字符串

文章目录 一、实现strStr()二、重复的子字符串 一、实现strStr() 先学学KMP算法&#xff0c;代码随想录 28.实现strStr() class Solution { public:void getNext(int* next, const string& s) {int j -1;next[0] j;for(int i 1; i < s.size(); i) { // 注意i从1开始…

微信小程序的微信一键登录与验证码登录

验证码登录 <template><view class"wx-login"><view class"login-Box"><text class"title">欢迎登录</text><text class"subTitle">再就业男团系统</text><view class"login-Form…

java原型模式

在Java中实现原型模式&#xff0c;可以通过使用对象克隆&#xff08;Cloneable&#xff09;接口和重写 clone() 方法来完成。原型模式用于通过复制现有对象来创建新对象&#xff0c;避免了使用构造函数创建对象的开销。 下面是一个简单的示例&#xff1a; 首先&#xff0c;我…

【算法基础:搜索与图论】3.3 拓扑排序

文章目录 拓扑排序介绍如何构造拓扑排序&#xff08;⭐重要&#xff01;&#xff09; 例题&#xff1a;848. 有向图的拓扑序列BFS 写法构造拓扑排序 相关题目练习207. 课程表&#xff08;判断是否存在拓扑序列&#xff09;bfs 写法dfs 写法 210. 课程表 II&#xff08;找到一个…

算法竞赛入门【码蹄集新手村600题】(MT1020-1040)

算法竞赛入门【码蹄集新手村600题】(MT1020-1040&#xff09; 目录MT1021 %f格式符MT1022 小数、指数MT1023 进制乱炖MT1024 进制形式MT1025 八、十六进制MT1026 合并MT1027 整数逆序MT1028 四位数逆序MT1029 位数MT1030 最大公约数MT1031 最简分数MT1032 最小公倍数MT1033 多项…

隐私政策声明

http://lxfamn.cn/tools 我们注重对您个人隐私的保护。有时候我们需要某些信息才能为您提供您请求的服务&#xff0c;本隐私声明解释了这些情况下的数据收集和使用情况。本隐私声明适用于本网站的所有相关服务。如果您访问本网站、使用本网站的任何服务&#xff0c;那么您便接受…

【前端知识】React 基础巩固(三十一)——Redux的简介

React 基础巩固(三十一)——Redux 一、Redux是个纯函数 概念 纯函数&#xff08;确定的输入一定产生确定的输出&#xff0c;函数在执行过程中不产生副作用&#xff09;&#xff1a; 在程序设计中&#xff0c;若一个函数符合以下条件&#xff0c;那么这个函数就被称为纯函数…

Docker 续

Docker 续 一、Docker 网络1.1 Docker 网络实现原理1.2 Docker 的网络模式1.2.1 Docker 网络模式分类 1.3 如何创建各类网络模式1.4 host模式1.5 container模式1.6 none模式1.7 bridge模式1.8 自定义网络 二、资源控制2.1 Cgroup2.2 CPU 资源控制2.2.1 设置CPU使用率上限2.2.2 …

Android compose学习笔记

如标题所言&#xff0c;就是一篇学习笔记而已&#xff0c;没有看的必要&#xff0c;只是写给自己看的&#xff0c;内容是慢慢更新的。 因为白天要上班&#xff0c;有时还会加班。而我自己也经常写一些个人项目&#xff0c;还会花时间玩游戏&#xff0c;而且现在所在的公司也不会…

c# Outlook检索设定问题

基于c# 设定outlook约会予定&#xff0c;时间格式是YYYY-MM-DD HH:mm 的情报。 问题发生&#xff1a; 根据开始时间&#xff08;2023/01/01 7:00&#xff09;条件查询该时间是否存在outlook信息时&#xff0c;明明存在一条数据&#xff0c;就是查询不出来数据 c#代码 Strin…

Observability:Synthetic monitoring - 动手实践

在我之前的如下文章里&#xff1a; Observability&#xff1a;Synthetic monitoring - 合成监测入门&#xff08;一&#xff09;&#xff08;二&#xff09; Observability&#xff1a;Synthetic monitoring - 创建浏览器监测&#xff0c;配置单独的浏览器监测器及项目 我详…

[flutter][报错]One or more plugins require a higher Android SDK version.

报文 One or more plugins require a higher Android SDK version. Fix this issue by adding the following to D:\github\flutter_password_saving_software\android\app\build.gradle: android {compileSdkVersion 33... }解决 修改方案&#xff1a;找到本地flutter安装目…

nginx路由

一般我们经常在访问网站时&#xff0c;通常会遇到输入某个页面的网址时&#xff0c;出现路由的转发&#xff0c;重定向等。可能访问的是一个网址&#xff0c;出来的时候就显示的是另外的地址。这是由于使用了nginx的缘故&#xff0c;保护了网址的安全性 &#xff08;1&#xf…

数据预处理matlab

matlab数据的获取、预处理、统计、可视化、降维 数据的预处理 - MATLAB & Simulink - MathWorks 中国https://ww2.mathworks.cn/help/matlab/preprocessing-data.html 一、数据的获取 1.1 从Excel中获取 使用readtable() 例1&#xff1a; 使用spreadsheetImportOption…

跟着gpt学算法(c和python)-排序-冒泡排序

排序算法是将一组数据按照特定规则进行排列的算法。排序算法可以按照不同的标准进行分类&#xff0c;比如稳定性、时间复杂度、空间复杂度等。以下是一些常见的排序算法&#xff1a; 冒泡排序&#xff08;Bubble Sort&#xff09;&#xff1a;相邻元素进行比较&#xff0c;较大…

JavaWeb_LeadNews_Day3-图片管理, 文章管理

JavaWeb_LeadNews_Day3-图片管理, 文章管理 图片管理图片上传实现思路获取用户信息将图片上传至minio 图片列表 文章管理频道列表查询文章列表查询文章发布实现思路具体代码 来源 图片管理 图片上传 实现思路 在GateWay解析前端请求, 获取用户信息, 存储在header中在Interce…