当前位置: 首页 > news >正文

奇怪的知识又增加了,ESP32下的Lisp编程:ULisp--Lisp for microcontrollers

ESP32下有MicroPython,那么我就在想,有Lisp语言支持吗?答案是果然有!有ULisp,专门为MCU设计的Lisp!

网址:uLisp - Lisp for microcontrollers

介绍:用于微控制器的 Lisp

适用于 Arduino、Adafruit M0/M4、Micro:bit、ESP32、RISC-V 和 Teensy 4.x 板的 Lisp。

uLisp® 是 Lisp 编程语言的一个版本,专门设计用于在具有有限 RAM 的微控制器上运行,从基于 ATmega328 的 Arduino Uno 到 Teensy 4.0/4.1。无论平台如何,您都可以使用完全相同的 uLisp 程序。有关每个平台的性能,请参阅 性能。

因为 uLisp 是一个解释器,所以你可以输入命令,并立即看到效果,而不必编译和上传你的程序。这使它成为学习编程或设置简单电子设备的理想环境。

Lisp 也是学习基本编程概念的理想语言。它结合了字符串处理、列表处理和垃圾回收,因此也是表达复杂想法的优秀语言,例如教机器人解决迷宫或在地图上找到最短的路线。除了支持一组核心的 Lisp 功能外,uLisp 还包括 Arduino 扩展,使其成为 Arduino 控制语言的理想选择。

下载软件

您可以从下载并安装 uLisp

下载ESP32的Ulist软件

这个链接:http://www.ulisp.com/list?50GW 

或者:

GitHub - technoblogy/ulisp-esp: A version of the Lisp programming language for ESP32-based boards.

 有两个版本,分别是ulisp-esp-comments.ino 和ulisp-esp.ino ,两个版本内容一样,只是ulisp-esp-comments.ino 代码里有注释。

直接把文件,也就是c源代码保存下来即可。ino后缀就是Arduino的文件。

下载Arduino UNO的UList软件

正好手里也有一块Arduino UNO的开发板,就顺便在它上面也安装UList试一下。

AVR-Nano version

Download the AVR-Nano version for AVR platforms with 32 or 48 Kbytes of program memory, such as the Arduino Uno, Arduino Nano, and Arduino Nano Every:

AVR-Nano Release 4.7 - 9th November 2024

or get it from GitHub at GitHub - technoblogy/ulisp: A version of the Lisp programming language for ATmega-based Arduino boards..

同样把源代码的文件保存即可。

编译安装

直接在Arduino中编译即可。当然ESP32可以在自己的ESP-IDF里面编译(没测试)。

在Arduino新创建的项目中黏贴文件代码。

在ESP32中编译安装

将ESP32开发板通过USB线接入主机,在Arduino IDE中设置好连线串口,然后点击左上角的箭头(对钩只编译),一键编译,上传。

编译好慢啊

编译失败。最终是在文件里加上这段才编译成功,不明白为什么我的esp32c3的板子,被认成了esp32,可以修改ESP32的定义:

​
#elif defined(ESP32)                             /* Generic ESP32 board */#define WORKSPACESIZE (9216-SDSIZE)            /* Objects (8*bytes) */#define MAX_STACK 8000#define LITTLEFS#include <LittleFS.h>#define SDCARD_SS_PIN 13#define LED_BUILTIN 13#define CPU_RISC_V

 也可以这样处理,在文件开始加入一句:

#define AIRM2M_CORE_ESP32C3

后面加入一段AIRM2M_CORE_ESP32C3的定义

#elif defined(AIRM2M_CORE_ESP32C3)#define WORKSPACESIZE (9216-SDSIZE)            /* Objects (8*bytes) */#define MAX_STACK 8000#define LITTLEFS#include <LittleFS.h>#define SDCARD_SS_PIN 13#define LED_BUILTIN 13#define CPU_RISC_V

这样就能识别出开发板了。 这块AIRM2M_CORE_ESP32C3开发板需要这样做,测试发现手上的ESP32S3开发板不需要这样做。

编译好这样显示:

在Arduino Uno中编译安装

另一块Arduino Uno的开发板也不闲着,选好开发板,设好连接的串口,跟ESP32开发板一样编译,上传。

编译好快啊

Sketch uses 32232 bytes (99%) of program storage space. Maximum is 32256 bytes.
Global variables use 1552 bytes (75%) of dynamic memory, leaving 496 bytes for local variables. Maximum is 2048 bytes.
 

这样就编译上传好了

测试

在Arduino Uno开发板上,将13端口接上一个LED灯,

在ESP32C3开发板上,直接用开发板上自带的LED灯,

在ULisp的交互界面,输入如下代码

(defun blink (&optional x)(pinmode :led-builtin :output)(digitalwrite :led-builtin x)(delay 1000)(blink (not x)))

然后输入

(blink)

我们就看到Arduino Uno开发板上13号接口的灯(或者ESP32C3开发板上自带的LED灯)在闪了,把频率调高一点:

(defun blink (&optional x)(pinmode :led-builtin :output)(digitalwrite :led-builtin x)(delay 500)(blink (not x)))

 好像没有变化啊,看来lisp跟python不太一样啊,python是冲掉原来的代码....

后来明白了,是灯闪了之后代码就一直执行卡在这里了,系统已经不接收任何指令,除非用“~”中断。这点跟MicroPython下不一样,MicroPython是将控制器返回给交互界面的。

使用“~”中断程序,这时候灯就不闪了,灯的状态停留在发出“~”指令的时候的状态。然后再去修改频率等,灯的闪烁状态就有新变化了。

安装Arduino ESP_OTA库

Installing uLisp

The download is a single text file. To compile it in the Arduino IDE either save it as a text file and rename it to a .cpp file, or copy and paste the text into a new empty project file. You can download the latest Arduino IDE from arduino.cc.

Select the correct Board option for your platform on the Tools menu, select the USB port from the Port menu, and upload uLisp. You should then be able to select Serial Monitor from the Tools menu, and interact with uLisp as described in Using uLisp.

The following pages give specific installation instructions for particular platforms:

循环亮灯也可以指定LED灯接的管脚,比如13号(13号就是ULisp在Arduino Uno和ESP32开发板里设定为led-builtin的默认管脚),

(defun b ()(pinmode 13 t)(loop(digitalwrite 13 t)(delay 1000)(digitalwrite 13 nil) (delay 1000)))

停住循环,用 "~"

  • Enter a "~" into the Serial Monitor entry field, and press Return.

小结

ULisp支持多种硬件系统,每种系统只需要下载一个Arduin格式的cpp文件(以.ino结尾),然后在Arduino IDE里编译、上传即可。

Ulisp里默认指定了一个led-builtin接线,对应13插口,这个插口对应ESP32C3开发板上的板载LED灯,非常方便我们练习用。

在ESP32C3里学习一点lisp

用问号查询 

首先可以查询函数和运算符,比如输入:(? assoc)

9216>  (? assoc)
(assoc key list [:test function])
Looks up a key in an association list of (key . value) pairs, using eq or the specified test function,
and returns the matching pair, or nil if no pair is found.
(+ number*)
Adds its arguments together.
If each argument is an integer, and the running total doesn't overflow, the result is an integer,
otherwise a floating-point number.

 驱动LED

在ESP32C3下用analogwrite:(analogwrite 10 128) 失败 ,这句话是点亮10脚的灯,但这是Arduino的。所以analogwrite这句指令不能用。

在ESP32C3下应该用:

(defun blink (&optional x)(pinmode :led-builtin t)(digitalwrite :led-builtin x)(delay 1000)(blink (not x)))(blink())

这个据说是点亮13脚的灯,我这个开发板没有13脚,但是开发板上板载的灯闪了,这时候才知道原来13脚被开发板用来接了LED灯啊!

闪起来之后交互就卡住了,要退出任务,需要用“~”来中断程序。

调试

ESP32编译报错'dacWrite' was not declared in this scope; did you mean 'i2cWrite'?

C:\Users\Admin\AppData\Local\Temp\.arduinoIDE-unsaved20241112-15076-ocdvvn.kcpg\sketch_dec12e\sketch_dec12e.ino:5345:3: note: in expansion of macro 'analogWrite'
 5345 |   analogWrite(pin, checkinteger(value));
      |   ^~~~~~~~~~~

exit status 1

Compilation error: 'dacWrite' was not declared in this scope; did you mean 'i2cWrite'?

还有这句:

'dacWrite' was not declared in this scope; did you mean 'i2cWrite'?
  213 |   #define analogWrite(x,y) dacWrite((x),(y)) 

看了下,没看明白。但是确实是dacWrite((x),(y)) 没有

引入arduino试试:

#include <Arduino.h>

还是不行。

用ESP32S3板子试试。这个就能编译成功。

倒是找到dacWrite((x),(y))了,在这个文件里:

arduino-esp32/cores/esp32/esp32-hal-dac.h at master · espressif/arduino-esp32 · GitHub

文件内容为:

/** SPDX-FileCopyrightText: 2019-2023 Espressif Systems (Shanghai) CO LTD** SPDX-License-Identifier: Apache-2.0*/#include "esp32-hal-dac.h"#if SOC_DAC_SUPPORTED
#include "esp32-hal.h"
#include "esp32-hal-periman.h"
#include "soc/dac_channel.h"
#include "driver/dac_oneshot.h"static bool dacDetachBus(void *bus) {esp_err_t err = dac_oneshot_del_channel((dac_oneshot_handle_t)bus);if (err != ESP_OK) {log_e("dac_oneshot_del_channel failed with error: %d", err);return false;}return true;
}bool __dacWrite(uint8_t pin, uint8_t value) {esp_err_t err = ESP_OK;if (pin != DAC_CHAN0_GPIO_NUM && pin != DAC_CHAN1_GPIO_NUM) {log_e("pin %u is not a DAC pin", pin);return false;  //not dac pin}dac_oneshot_handle_t bus = (dac_oneshot_handle_t)perimanGetPinBus(pin, ESP32_BUS_TYPE_DAC_ONESHOT);if (bus == NULL) {perimanSetBusDeinit(ESP32_BUS_TYPE_DAC_ONESHOT, dacDetachBus);if (!perimanClearPinBus(pin)) {return false;}dac_channel_t channel = (pin == DAC_CHAN0_GPIO_NUM) ? DAC_CHAN_0 : DAC_CHAN_1;dac_oneshot_config_t config = {.chan_id = channel};err = dac_oneshot_new_channel(&config, &bus);if (err != ESP_OK) {log_e("dac_oneshot_new_channel failed with error: %d", err);return false;}if (!perimanSetPinBus(pin, ESP32_BUS_TYPE_DAC_ONESHOT, (void *)bus, -1, channel)) {dacDetachBus((void *)bus);return false;}}err = dac_oneshot_output_voltage(bus, value);if (err != ESP_OK) {log_e("dac_oneshot_output_voltage failed with error: %d", err);return false;}return true;
}bool __dacDisable(uint8_t pin) {if (pin != DAC_CHAN0_GPIO_NUM && pin != DAC_CHAN1_GPIO_NUM) {log_e("pin %u is not a DAC pin", pin);return false;  //not dac pin}void *bus = perimanGetPinBus(pin, ESP32_BUS_TYPE_DAC_ONESHOT);if (bus != NULL) {// will call dacDetachBusreturn perimanClearPinBus(pin);} else {log_e("pin %u is not attached to DAC", pin);}return false;
}extern bool dacWrite(uint8_t pin, uint8_t value) __attribute__((weak, alias("__dacWrite")));
extern bool dacDisable(uint8_t pin) __attribute__((weak, alias("__dacDisable")));#endif

 发现这个文件里arduino-esp32/cores/esp32/esp32-hal.h at master · espressif/arduino-esp32 · GitHub也有这个定义,void analogWrite(uint8_t pin, int value);

这样在Arduino里面是不是不用转义了?

本来想不转义了,于是去看代码,结果看到了这里:

#elif defined(ARDUINO_ADAFRUIT_QTPY_ESP32C3)#define WORKSPACESIZE (9216-SDSIZE)            /* Objects (8*bytes) */#define MAX_STACK 8000#define LITTLEFS#include <LittleFS.h>#define SDCARD_SS_PIN 13#define LED_BUILTIN 13#define CPU_RISC_V// Legacy boards ***************************************************************#elif defined(ESP32)                             /* Generic ESP32 board */#define WORKSPACESIZE (9216-SDSIZE)            /* Objects (8*bytes) */#define MAX_STACK 7000#define LITTLEFS#include <LittleFS.h>#define analogWrite(x,y) dacWrite((x),(y))#define SDCARD_SS_PIN 13#define LED_BUILTIN 13#define CPU_LX6

根据报错信息,主板没有选对ESP32C3,而是选成了ESP32 ,这就比较搞了...

修改代码,加上

#elif defined(ARDUINO_AIRM2M_CORE_ESP32C3)#define WORKSPACESIZE (9216-SDSIZE)            /* Objects (8*bytes) */#define MAX_STACK 8000#define LITTLEFS#include <LittleFS.h>#define SDCARD_SS_PIN 13#define LED_BUILTIN 13#define CPU_RISC_V

编译,还是报错,不明白为什么还是没认出板子来?

它就认成esp32了?这不bug了吗?

手工写上:

#elif defined(ESP32)                             /* Generic ESP32 board */#define WORKSPACESIZE (9216-SDSIZE)            /* Objects (8*bytes) */#define MAX_STACK 8000#define LITTLEFS#include <LittleFS.h>#define SDCARD_SS_PIN 13#define LED_BUILTIN 13#define CPU_RISC_V

编译,终于过了!

显示:

Wrote 1128144 bytes (683960 compressed) at 0x00010000 in 13.9 seconds (effective 649.0 kbit/s)...
Hash of data verified.

Leaving...
Hard resetting via RTS pin...

除了这样处理,还可以在文件开始加入一句:

#define AIRM2M_CORE_ESP32C3

后面加入一段

#elif defined(AIRM2M_CORE_ESP32C3)#define WORKSPACESIZE (9216-SDSIZE)            /* Objects (8*bytes) */#define MAX_STACK 8000#define LITTLEFS#include <LittleFS.h>#define SDCARD_SS_PIN 13#define LED_BUILTIN 13#define CPU_RISC_V

相关文章:

奇怪的知识又增加了,ESP32下的Lisp编程:ULisp--Lisp for microcontrollers

ESP32下有MicroPython&#xff0c;那么我就在想&#xff0c;有Lisp语言支持吗&#xff1f;答案是果然有&#xff01;有ULisp&#xff0c;专门为MCU设计的Lisp&#xff01; 网址&#xff1a;uLisp - Lisp for microcontrollers 介绍&#xff1a;用于微控制器的 Lisp 适用于 Ar…...

STM32标准库学习之寄存器方法点亮LED灯

STM32C8T6最小系统开发板&#xff0c;点亮PC13引脚的LED灯 1.使能PC13引脚的定时器 PC13引脚为GPIOC组的第13个端口&#xff0c;GPIO的时钟使能定时器为RCC_APB2ENR&#xff0c;这是可以从手册中得出的&#xff0c;如下图所示 从下图可以得出&#xff0c;若要使能GPIOC端口&a…...

Jenkins:持续集成与持续部署的利器

&#x1f407;明明跟你说过&#xff1a;个人主页 &#x1f3c5;个人专栏&#xff1a;《未来已来&#xff1a;云原生之旅》&#x1f3c5; &#x1f516;行路有良友&#xff0c;便是天堂&#x1f516; 目录 一、引言 1、什么是Jenkins 2、Jenkins的起源 二、Jenkins的核心…...

概率论得学习和整理30: 用EXCEL 描述泊松分布 poisson distribution

目录 1 泊松分布的基本内容 1.1 泊松分布的关键点 1.1.1 属于离散分布 1.1.2 泊松分布的特点&#xff1a;每个子区间内概率相等 &#xff0c; λ就是平均概率 1.2 核心参数 1.3 pmf公式 1.4 期望和方差 2 例1&#xff1a;用EXCEL计算泊松分布的概率 3 比较λ不同值时…...

汽车SoC芯片及其安全岛设计与未来发展趋势(学习笔记)

SoC系列已发布多篇文章&#xff0c;之前应该发布到4.3章节&#xff0c;后续还有包含常见汽车SoC&#xff0c;SoC评价指标&#xff0c;产业链及发展趋势等&#xff0c;均见已发布完整版本付费资源&#xff0c;链接如下&#xff1a; 汽车SoC芯片及其安全岛设计与未来发展趋势&am…...

【排序算法】——选择排序

前言 排序(Sorting) 是计算机程序设计中的一种重要操作&#xff0c;它的功能是将一个数据元素&#xff08;或记录&#xff09;的任意序列&#xff0c;重新排列成一个关键字有序的序列。所谓排序&#xff0c;就是使一串记录&#xff0c;按照其中的某个或某些关键字的大小&#x…...

第十五章 Linux Shell 编程

15.1 Shell 变量 了解&#xff1a;Shell的功能 了解&#xff1a;Shell的种类 了解&#xff1a;Shell的调用 了解&#xff1a;Shell变量的概念 了解&#xff1a;Shell变量的定义 了解&#xff1a;Shell数组变量 了解&#xff1a;Shell内置变量 了解&#xff1a;双引号 和…...

【c++笔试强训】(第三十八篇)

目录 不相邻取数&#xff08;动态规划-线性dp&#xff09; 题目解析 讲解算法原理 编写代码 空调遥控&#xff08;⼆分/滑动窗⼝&#xff09; 题目解析 讲解算法原理 编写代码 不相邻取数&#xff08;动态规划-线性dp&#xff09; 题目解析 1.题目链接&#xff1a;不相…...

go 自己写序列化函数不转义

以map[int32]string转化为[]byte为例 背景&#xff1a;算法传给我一个map[int32]string类型的值&#xff08;map的值本身是json转化成的string&#xff09;&#xff0c;我需要把这个值生成一个文件上传到OSS&#xff0c;但是发现通过url下载下来的文件里面有转义字符。 原因&a…...

一般行业安全管理人员考试题库分享

1.在高速运转的机械飞轮外部安装防护罩&#xff0c;属于(B)安全技术措施。 A.限制能量 B.隔离 C.故障设计 D.设置薄弱环节 2.生产经营单位的(B)是本单位安全生产的第一责任人&#xff0c;对落实本单位安全生产主体责任全面负责&#xff0c;具体履行安全生产管理职责。 A.全员 B…...

Marketo REST API 批量修改邮件内容

以下是更加细化的 使用 Marketo REST API 批量修改邮件内容 的步骤&#xff0c;详细解释每个阶段的操作&#xff0c;包括 API 的请求、数据处理及潜在问题解决。 前期准备工作 确保 Marketo API 访问权限 你需要 Marketo REST API 用户 和 API Role&#xff0c;有权限访问邮件资…...

《云原生安全攻防》-- K8s安全框架:认证、鉴权与准入控制

从本节课程开始&#xff0c;我们将来介绍K8s安全框架&#xff0c;这是保障K8s集群安全比较关键的安全机制。接下来&#xff0c;让我们一起来探索K8s安全框架的运行机制。 在这个课程中&#xff0c;我们将学习以下内容&#xff1a; K8s安全框架&#xff1a;由认证、鉴权和准入控…...

淘宝获取sku详细信息 API

淘宝获取 SKU 详细信息的 API 主要是 taobao.item_sku 接口&#xff0c;以下是详细介绍&#xff1a; 公共参数 key&#xff1a;调用 key&#xff0c;是调用接口的身份验证信息&#xff0c;必须以 GET 方式拼接在 URL 中1.secret&#xff1a;调用密钥&#xff0c;与 key 配合使…...

基于Spring Boot的体育商品推荐系统

一、系统背景与目的 随着电子商务的快速发展和人们健康意识的提高&#xff0c;体育商品市场呈现出蓬勃发展的态势。然而&#xff0c;传统的体育商品销售方式存在商品种类繁多、用户选择困难、个性化需求无法满足等问题。为了解决这些问题&#xff0c;基于Spring Boot的体育商品…...

C++小细节笔记

1、C字符串转数字 – 数字转字符串 //string > int 使用 stoi stol//int > string 使用 to_string()2、C遍历 int evalRPN(vector<string>& tokens) {stack<int> intStack;for(string &str:tokens){}bool isValid(string s) {stack<char> …...

go语言并发读写数据队列,不停写的同时,一次最多读取指定量数据(逐行注释)

1、数据队列可以存储任意类型的一个数据&#xff08;下程序是添加整数值&#xff09;。 数据队列代码点这里查看《go语言结构体实现数据结构队列&#xff08;先进先出&#xff09;存储数据&#xff08;逐行注释&#xff09;》 2、读写操作并发进行&#xff08;下程序向队列中…...

密码学——密码学概述、分类、加密技术(山东省大数据职称考试)

大数据分析应用-初级 第一部分 基础知识 一、大数据法律法规、政策文件、相关标准 二、计算机基础知识 三、信息化基础知识 四、密码学 五、大数据安全 六、数据库系统 七、数据仓库. 第二部分 专业知识 一、大数据技术与应用 二、大数据分析模型 三、数据科学 密码学 大数据…...

【数据库MySQL篇二】MySQL数据库入门基础教程:一网打尽数据库和表各种操作、命令和语法

一、MySQL创建数据库 使用Create命令创建数据库 我们可以在登陆 MySQL 服务后&#xff0c;使用 create 命令创建数据库&#xff0c;语法如下: CREATE DATABASE 数据库名; 以下命令简单的演示了创建数据库的过程&#xff0c;数据名为 RUNOOB: [roothost]# mysql -u root -p…...

Android 解决“Could not resolve all artifacts for configuration ‘:classpath‘方法

前些天发现了一个蛮有意思的人工智能学习网站,8个字形容一下"通俗易懂&#xff0c;风趣幽默"&#xff0c;感觉非常有意思,忍不住分享一下给大家。 &#x1f449;点击跳转到教程 报错背景&#xff0c;公司的项目&#xff0c;长时间没有打开&#xff0c;时隔半年再次打…...

青少年编程与数学 02-004 Go语言Web编程 08课题、使用Gin框架

青少年编程与数学 02-004 Go语言Web编程 08课题、使用Gin框架 一、Gin框架二、接收和处理请求三、应用示例 课题摘要:本文介绍了Gin框架的特点、如何接收和处理请求以及一个应用示例。Gin是一个高性能、轻量级的Go语言Web框架&#xff0c;以其快速、极简设计、强大的路由和中间…...

PostgreSQL: 事务年龄

排查 在 PostgreSQL 数据库中&#xff0c;事务年龄&#xff08;也称为事务 ID 年龄&#xff09;是一个重要的监控指标&#xff0c;因为 PostgreSQL 使用事务 ID&#xff08;XID&#xff09;来保持事务的隔离性。每个事务都会被分配一个唯一的事务 ID&#xff0c;这个 ID 随着每…...

C# 识别二维码

文章目录 一. 二维码识别技术概述二 维码识别的步骤图像预处理二维码的定位和检测二维码解码 三 常用的二维码识别库1. OpenCV2. ZXing.Net 一. 二维码识别技术概述 二维码是一种通过黑白矩阵排列来编码数据的图形符号&#xff0c;它的编码方式具有较强的容错性&#xff0c;可以…...

KeepAlive与RouterView缓存

参考 vue动态组件&#xff1c;Component&#xff1e;与&#xff1c;KeepAlive&#xff1e; KeepAlive官网介绍 缓存之keep-alive的理解和应用 Vue3Vite KeepAlive页面缓存问题 vue多级菜单(路由)导致缓存(keep-alive)失效 vue3 router-view keeperalive对于同一路径但路径…...

RK3588 , mpp硬编码rgb, 保存MP4视频文件.

RK3588 , mpp硬编码yuv, 保存MP4视频文件. ⚡️ 传送 ➡️ RK3588, FFmpeg 拉流 RTSP, mpp 硬解码转RGBRk3588 FFmpeg 拉流 RTSP, 硬解码转RGBUbuntu x64 架构, 交叉编译aarch64 FFmpeg mppCode Init MppMPP_RET init_mpp...

使用 Wireshark 和 Lua 脚本解析通讯报文

在复杂的网络环境中&#xff0c;Wireshark 凭借其强大的捕获和显示功能&#xff0c;成为协议分析不可或缺的工具。然而&#xff0c;面对众多未被内置支持的协议或需要扩展解析的场景&#xff0c;Lua 脚本的引入为Wireshark 提供了极大的灵活性和可扩展性。本文将详细介绍如何使…...

ElasticSearch08-分析器详解

零、文章目录 ElasticSearch08-分析器详解 1、分析器原理 Elasticsearch的分词器&#xff08;Analyzer&#xff09;是全文搜索的核心组件&#xff0c;它负责将文本转换为一系列单词&#xff08;term/token&#xff09;的过程&#xff0c;也叫分词。 &#xff08;1&#xff…...

【IN、NOT、AND、OR】在 MySql 中的使用方法,使用场景、注意事项

目录 IN NOT AND OR 注意事项&#xff1a; 使用场景&#xff1a; IN 用于指定某个字段的值在一个预定义的列表中。 SELECT * FROM users WHERE age IN (20, 25, 30);查询返回 age 字段 是20、25 、30 的用户记录。 NOT 用于对条件进行否定。 查询将返回与指定 条件相…...

Face to face

1.西班牙添加5G volte 首先carrierconfig里使能 <boolean name"carrier_nr_available_bool" value"true" /> <boolean name"carrier_volte_available_bool" value"true" /> 其次 组件apn配置ims参数 2.印度j…...

宝塔配置python项目提示python版本与安装的不符

用宝塔的网站添加了项目&#xff0c;配置选择了python3.8&#xff0c;但是在终端并且进入了虚拟环境查看python的版本居然还是默认是2.7.5版本。 官方是举列说明&#xff0c;这张图是用python管理器生成的 而我用的 网站--python项目&#xff0c; 那么虚拟路径在 /www/serve…...

Restaurants WebAPI(一)—— clean architecture

文章目录 项目地址一、Restaurants.Domain 核心业务层1.1 Entities实体层1.2 Repositories 数据操作EF的接口二、Restaurants.Infrastructure 基础设施层2.1 Persistence 数据EF CORE配置2.2 Repositories 数据查询实现2.3 Extensions 服务注册三、Restaurants.Application用例…...