300行Lisp根据语法和词法生成解析器

2023-10-27

1. 概要

无,作者自闭中。。。

2. 代码

(defun make-token (class-name data)
  (list class-name data))

(defun make-string-scanner (scanner-spec)
  (lambda (str)
    (with-input-from-string
     (stream str)
     (scan-stream stream scanner-spec))))

(defun make-stream-scanner (scanner-spec)
  (lambda (stream)
    (scan-stream stream scanner-spec)))

(defun re-read (v)
  (if (vectorp v)
      (let ((buffer (svref v 1))
	    (fun (svref v 0)))
	(if buffer
	    (cond
	      ((functionp fun) (re-read (vector (funcall fun (car buffer)) (cdr buffer))))
	      ((vectorp fun) (vector (svref fun 0) (append (svref fun 1) buffer)))
	      (t v))
	    fun))
      v))

(defun scan-stream (stream scanner-spac)
  (let ((scanner-list (mapcar #'token-spec->scanner scanner-spac)))
    (labels
	((iter (stream scanners token-list &optional buffer)
	   (let ((c (read-char stream nil 'end-of-stream)))
	     (if (not (characterp c))
		 (reverse token-list)
		 (let ((temp (mapcar #'(lambda (s)
					 (etypecase s
					   (function (funcall s c))
					   (cons (vector s (cons c nil)))
					   (vector (vector (svref s 0) (cons c (svref s 1))))))
				     scanners)))
		   (if (some #'functionp temp)
		       (iter stream temp token-list (cons c buffer))
		       (let* ((scan-result (car (sort temp #'< :key (lambda (s) (if (vectorp s)
										    (if (svref s 0)
											(length (svref s 1))
											most-positive-fixnum)
										   0)))))
			      (r (if (vectorp scan-result) (svref scan-result 0) scan-result))
			      (unuse-buffer (if (vectorp scan-result) (reverse (svref scan-result 1)))))
			 (if (null r)
			     (error "scan error:~A not match any scanner~%" (reverse buffer))
			     (destructuring-bind (token-string name action) r
			       (iter (if unuse-buffer
					       (make-concatenated-stream
						 (make-string-input-stream (coerce unuse-buffer 'string))
						 stream)
					       stream)
				     scanner-list
				     (ecase action
				       (skip token-list)
				       (symbol (cons (make-token name (make-symbol token-string)) token-list))
				       (number (cons (make-token name (read-from-string token-string)) token-list))
				       (string (cons (make-token name token-string) token-list)))))))))))))
      (iter stream scanner-list nil))))

(defun token-spec->scanner (raa)
  (destructuring-bind (name regexp action) raa
    (labels
	((make-concat-receiver (regexp receiver backouter)
	   (lambda (char-seq)
	     (if (cdr regexp)
		 (regexp->scanner (cdr regexp)
				  (lambda (char-seq2) (funcall receiver (append char-seq char-seq2)))
				  (lambda (char-seq2) (funcall backouter (append char-seq char-seq2))))
		 (funcall receiver char-seq))))
	 (make-single-char-scanner (regexp receiver char-tester backouter)
	   (lambda (c)
	     (if (funcall char-tester c)
		 (if (cdr regexp)
		     (regexp->scanner (cdr regexp)
				      (lambda (s) (funcall receiver (cons c s)))
				      (lambda (s) (funcall backouter (cons c s))))
		     (funcall receiver (cons c nil)))
		 (vector nil (cons c nil)))))
	 (regexp->scanner (regexp receiver backouter)
	   (let ((exp (car regexp)))
	     (cond
	       ((stringp exp)
		(regexp->scanner
		 (cons (cons 'concat (coerce exp 'list)) (cdr regexp))
		 receiver backouter))
	       ((consp exp)
		(regexp->scanner exp (make-concat-receiver regexp receiver backouter) backouter))
	       ((characterp exp)
		(make-single-char-scanner regexp receiver (lambda (c) (eql c exp)) backouter))
	       ((eql exp 'letter)
		(make-single-char-scanner regexp receiver #'alpha-char-p backouter))
	       ((eql exp 'digit)
		(make-single-char-scanner regexp receiver #'digit-char-p backouter))
	       ((eql exp 'any)
		(make-single-char-scanner regexp receiver (constantly t) backouter))
	       ((eql exp 'not)
		(lambda (c)
		  (if (not (eql c (cadr regexp)))
		      (funcall receiver (cons c nil))
		      (vector nil (cons c nil)))))
	       ((eql exp 'whitespace)
		(regexp->scanner
		 '((or #\Space #\NewLine) (arbno (or #\Space #\NewLine)))
		 (make-concat-receiver regexp receiver backouter)
		 backouter))
	       ((eql exp 'or)
		(labels
		    ((make-or-scan (or-scanners &optional buffer)
		       (labels
			   ((or-scan (c)
			      (let ((temp (mapcar (lambda (s)
						    (etypecase s
						      (function (funcall s c))
						      (cons (vector s (cons c nil)))
						      (vector (vector (svref s 0) (cons c (svref s 1))))))
						  or-scanners)))
				(if (some #'functionp temp)
				    (make-or-scan temp (cons c nil))
				    (let ((r (car (sort temp #'< :key (lambda (s)
									(if (vectorp s)
									    (length (svref s 1))
									    0))))))
				      (etypecase r
					(cons (funcall receiver r))
					(vector (re-read (vector (funcall receiver (svref r 0)) (reverse (svref r 1)))))
					(null (vector nil (funcall backouter (reverse (cons c buffer)))))))))))
			 #'or-scan)))
		  (make-or-scan (mapcar (lambda (e) (regexp->scanner (cons e nil) #'identity #'identity)) (cdr regexp)))))
	       ((eql exp 'arbno)
		(lambda (c)
		  (let ((r (funcall (regexp->scanner (cdr regexp) #'identity #'identity) c)))
		    (labels
			((handle-result (r buffer)
			   (etypecase r
			     (cons (regexp->scanner regexp
						    (lambda (s) (funcall receiver (append r s)))
						    (lambda (s) (funcall backouter (append (reverse buffer) s)))))
			     (vector (re-read (vector (funcall receiver (svref r 0)) (svref r 1))))
			     (function (lambda (c) (handle-result (funcall r c) (cons c buffer))))
			     (null (re-read (vector (funcall receiver nil) (reverse buffer)))))))
		      (handle-result r (cons c nil))))))
	       ((eql exp 'concat)
		(regexp->scanner (cdr regexp) receiver backouter))
	       (t (error "Unknown expression:~A~%" exp))))))
      (regexp->scanner regexp (lambda (s) (if s (list (coerce s 'string) name action))) #'identity))))

(defun parse-token (grammar-spec token-list)
  (let ((prod-parser-table (make-hash-table)))
    (dolist (production grammar-spec)
      (destructuring-bind (lhs rhs-list prod-name) production
	(push (production->parser production prod-parser-table) (gethash lhs prod-parser-table))))
    (let ((parser-list '()))
      (maphash (lambda (k v) (setf parser-list (append parser-list v))) prod-parser-table)
      (labels
	  ((iter (token-list parsers receiver)
	     (if (null token-list)
		 (funcall receiver nil)
		 (let ((temps (mapcan (lambda (r)
					(and (or (functionp r) (consp r) (and (vectorp r) (consp (svref r 0)))) (list r)))
				      (mapcar (lambda (p)
						(etypecase p
						  (function (funcall p (car token-list)))
						  (cons (vector p (cons (car token-list) nil)))
						  (vector (vector (svref p 0) (nconc (svref p 1) (cons (car token-list) nil))))))
					      parsers))))
		   (if (some #'functionp temps)
		       (iter (cdr token-list) temps receiver)
		       (let ((r (car (sort temps #'< :key (lambda (p) (etypecase p
									(cons 0)
									(vector (length (svref p 1)))))))))
			 (etypecase r
			   (cons (iter (cdr token-list) parser-list (lambda (gs) (cons r gs))))
			   (vector (iter (append (svref r 1) (cdr token-list)) parser-list (lambda (gs) (cons (svref r 0) gs)))))))))))
	(iter token-list parser-list #'identity)))))

(defun production->parser (production parser-table)
  (destructuring-bind (lhs rhs-list prod-name) production
    (labels
	((rhs->parser (remain-rhs receiver backouter)
	   (let ((rhs (car remain-rhs)))
	     (cond
	       ((and (symbolp rhs) (not (equal rhs 'arbno)) (not (equal rhs 'separated-list)))
		(labels
		    ((parse-lhs (parsers buffer)
		       (lambda (token)
			 (if (null parsers)
			     (if (equal rhs (car token))
				 (if (cdr remain-rhs)
				     (rhs->parser (cdr remain-rhs)
						  (lambda (p) (cons (cadr token) p))
						  (lambda (ts) (funcall backouter (append (reverse (cons token buffer)) ts))))
				     (funcall receiver (cons (cadr token) nil)))
				 (vector nil (funcall backouter (reverse (cons token buffer)))))
			     (let* ((temps (mapcar (lambda (parser)
						     (if (functionp parser)
							 (funcall parser token)
							 parser))
						   parsers))
				    (r (find-if #'consp temps)))
			       (if (some #'functionp temps)
				   (parse-lhs temps (cons token buffer))
				   (let ((r (car (sort temps #'< :key (lambda (p) (etypecase p
										    (cons 0)
										    (vector (length (svref p 1)))))))))
				     (etypecase r
				       (cons (if (cdr remain-rhs)
						 (rhs->parser (cdr remain-rhs)
							      (lambda (p) (funcall receiver (cons r p)))
							      (lambda (ts) (funcall backouter (append (reverse (cons token buffer)) ts))))
						 (funcall receiver (cons r nil))))
				       (vector (if (cdr remain-rhs)
						   (rhs->parser (cdr remain-rhs)
								(lambda (p) (funcall (cons (svref r 0) p)))
								(lambda (ts) (funcall backouter (append (reverse (cons token buffer)) ts))))
						   (funcall receiver (cons (svref r 0) nil))))))))))))
		  (parse-lhs (gethash rhs parser-table) nil)))
	       ((stringp rhs)
		(lambda (token)
		  (if (equal rhs (cadr token))
		      (if (cdr remain-rhs)
			  (rhs->parser (cdr remain-rhs) receiver (lambda (ts) (funcall backouter (cons token ts))))
			  (funcall receiver nil))
		      (vector nil (cons token nil)))))
	       ((consp rhs)
		(lambda (token)
		  (funcall (rhs->parser rhs
					(lambda (r1)
					  (if (cdr remain-rhs)
					      (rhs->parser (cdr remain-rhs)
							   (lambda (r2)
							     (funcall receiver (cons r1 r2)))
							   (lambda (ts) (funcall backouter (cons token ts))))
					      (funcall receiver r1)))
					backouter)
			   token)))
	       ((eql 'arbno rhs)
		(lambda (token)
		  (let ((r (funcall (rhs->parser (cdr remain-rhs) #'identity #'identity) token)))
		    (labels
			((handle-result (r buffer)
			   (etypecase r
			     (cons (rhs->parser remain-rhs (lambda (r2)
							     (funcall receiver (if r2 (mapcar #'list r r2) r)))
						(lambda (ts) (funcall backouter (append (reverse buffer) ts)))))
			     (function (lambda (token)
			       (handle-result (funcall r token) (cons token buffer))))
			     (vector (re-read (vector (funcall receiver (svref r 0)) (svref r 1))))
			     (null (re-read (vector (funcall receiver nil) (reverse buffer)))))))
		      (handle-result r (cons token nil))))))
	       ((eql 'separated-list rhs)
		(lambda (token)
		  (let ((r (funcall (rhs-parser (butlast (cdr remain-rhs)) #'identity backouter) token)))
		    (labels
			((handle-result (r buffer)
			   (etypecase r
			     (cons
			      (lambda (token)
				(if (string-equal (cadr token) (car (last remain-rhs)))
				    (rhs->parser remain-rhs (lambda (r2) (funcall receiver (mapcar #'cons r r2)))
						 (lambda (ts) (funcall backouter (append (reverse (cons token buffer)) ts))))
				    (re-read (vector (funcall receiver nil) (funcall backouter (append (reverse (cons token buffer)) ts)))))))
			     (function
			      (lambda (token)
			       (handle-result (funcall r token) (cons token buffer))))
			     (vector
			      (re-read (vector (funcall receiver (svref r 0)) (svref r 1))))
			     (null
			      (re-read (vector (funcall receiver nil) (funcall backouter (reverse buffer))))))))
		      (handle-result r (cons token nil))))))
	       (t (error "Unexpected rhs:~A~%" rhs))))))
      (rhs->parser rhs-list (lambda (r) (cons prod-name r)) #'identity))))

(defun make-string-parser (the-lexical-spec the-grammar)
  (labels ((find-keywords (rhs-items receiver)
	     (if (null rhs-items)
		 (funcall receiver nil)
		 (etypecase (car rhs-items)
		   (string (find-keywords (cdr rhs-items) (lambda (ks) (funcall receiver (cons (car rhs-items) ks)))))
		   (symbol (find-keywords (cdr rhs-items) receiver))
		   (cons (let ((cks (find-keywords (car rhs-items) #'identity)))
			   (find-keywords (cdr rhs-items) (lambda (ks) (funcall receiver (append cks ks))))))))))
    (let* ((ext-lexical-spec `((keyword
				((or ,@(reduce (lambda (l1 l2) (union l1 l2 :test #'equal))
					      (mapcar
					       (lambda (production) (find-keywords (cadr production) #'identity))
					       the-grammar))))
				string)
			       ,@the-lexical-spec))
	   (scanner (make-string-scanner ext-lexical-spec)))
      (lambda (s)
	(let ((token-list (funcall scanner s)))
	  (format t "token-list:~A~%" token-list)
	  (parse-token the-grammar token-list))))))

3. 使用

(setf the-lexical-spec
      '((whitespace ((or #\Space #\NewLine) (arbno (or #\Space #\NewLine))) skip)
	(comment ("//" (arbno (not #\newline))) skip)
	(identifier (letter (arbno (or letter digit "_" "-" "?"))) symbol)
	(number (digit (arbno digit)) number)
	(number ("-" digit (arbno digit)) number)))

(setf the-grammar
      '((program (expression) a-program)
	(expression (number) const-exp)
	(expression
	 ("-" "(" expression "," expression ")")
	 diff-exp)
	(expression
	 ("zero?" "(" expression ")")
	 zero?-exp)
	(expression
	 ("if" expression "then" expression "else" expression)
	 if-exp)
	(expression (identifier) var-exp)
	(expression
	 ("let" (arbno identifier "=" expression) "in" expression)
	 let-exp)))

(defun test-scan ()
  (funcall (make-string-scanner the-lexical-spec)
	   "asdf  1234  -4321   // skdlajf"))

(defun scan1 (s)
  (funcall (make-string-scanner the-lexical-spec)
	   s))

(defun scan&parse1 (s)
  (funcall (make-string-parser the-lexical-spec the-grammar) s))

(defun test-parse ()
  (scan&parse1 "let x = y u1 = 321 in z "))
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

300行Lisp根据语法和词法生成解析器 的相关文章

  • 如何在 Emacs Lisp 中设置列​​表中的一部分参数?

    我想设置PROGRAM ARGS of start process从列表中 Like start process process name foobar process path append some args list concat t
  • 在编译器中实现闭包

    我正在尝试设计一个伪汇编代码的基本编译器 但是 我不知道如何实现闭包 看来我需要将特定的寄存器值与每个 子例程 相关联 我考虑过使用堆栈 但它似乎又不够 似乎只有关联数组才能工作 但是如何在汇编中完成该操作或类似的操作呢 我选择尝试表示的示
  • 使 clos 对象可在 lisp 中打印

    如果你想让 common lisp 中的 CLOS 对象可打印 可读打印 你如何在不使用除了 print 和 read 之外的任何东西的情况下做到这一点 至少在我的解决方案中 有两个部分可以做到这一点 但是您将需要这个功能 感谢 cl pr
  • common lisp:宏如何使用以编程方式生成的名称定义其他方法/宏?

    我意识到我的代码的某个部分由看起来相似的方法组组成 就像我有多个三重奏 一个由程序员的其他两个函数调用的辅助函数 我正在尝试编写一个宏来为我定义这三个函数 以便我所需要做的就是调用该宏 但我的尝试导致 defun 和函数调用将引用字符串而不
  • LISP - 小数点后的数字

    有谁知道如何在 Lisp 中指定浮点数小数点后的位数 假设我在 REPL 上打印此命令 CL USER 3 gt format t 15f float 1 7 I get 0 142857150000000 但是该数字四舍五入到小数点后第
  • LISP:关键字参数,提供-p

    目前我正在学习 Peter Seibel 的 Practical Common Lisp 在 实用 一个简单的数据库 一章中 http www gigamonkeys com book practical a simple database
  • 在lisp中,如何使用floor函数返回的第二个值?

    当我这样做时 4楼3 我得到了 1 1 3 但我该如何使用这 1 3 呢 例如 您可以使用将其绑定到变量multiple value bind multiple value bind quot rem floor 4 3 format t
  • 如何理解clojure的lazy-seq

    我正在尝试理解 Clojurelazy seq运算符 以及惰性求值的一般概念 我知道这个概念背后的基本思想 表达式的求值被延迟 直到需要该值为止 一般来说 这可以通过两种方式实现 在编译时使用宏或特殊形式 在运行时使用 lambda 函数
  • CLISP - 反转简单列表

    我必须反转简单 单维 列表的元素 我知道有一个内置的反向函数 但我不能用它来做这个 这是我的尝试 defun LISTREVERSE LISTR cond lt length LISTR 2 LISTR listr is 1 atom or
  • Common Lisp 中的(随机)不那么随机?

    好的 最后一个问题 我将用 Common Lisp 完成我的猜数游戏 D 每当游戏开始 或者在第一个游戏之后开始新游戏 时 都会调用以下函数 Play the game defun play If it s their first time
  • 在 Parenscript 中使用 regex(正则表达式)

    我正在尝试 Parenscript 在尝试使用正则表达式函数时 我得到了意外的输出 例如 参考手册 https common lisp net project parenscript reference html shows regex f
  • 展开方案中的函数

    Goal 实施unfold仅使用两个参数的函数 论据 第一个参数是 f 它接受某种类型 I 的初始值并返回 nil 或两个元素的 cons 对 这两个元素中的第一个是某种类型 A 的列表中的下一个元素 下一个初始值又是某些类型 I 第二个参
  • let* 和 set 之间的区别?在 Common Lisp 中

    我正在从事一个基因编程爱好项目 我有一个函数 宏设置 当以 setq setf 形式评估时 将生成一个如下所示的列表 setq trees make trees 2 gt x abs x 然后它将绑定到 lambda 函数
  • 如何在 Clojure 中遍历一棵树,同时收集每个节点节点的值?

    我想创建一个函数来收集二叉树中每个节点的值 在 ClojureDocs 中 我发现了几个用于遍历树 图的函数 例如 tree seq prewalk 和 postwalk https clojuredocs org clojure core
  • Lisp 中的 (定义 (平均 ....))

    我只是在玩scheme lisp 并正在考虑如何纠正我自己的定义average 我不确定如何做一些我认为需要的事情 定义一个接受任意数量参数的过程 计算这些参数 将参数列表传递给 以将它们加在一起 有人有定义的例子吗average 我似乎对
  • 从when语句内的函数返回

    我想做的就是使用 when 语句返回一个值 我想要以下功能 if x return y 我正在尝试使用 when x y 但是when语句并没有以退出函数并返回y的方式进行计算 它只是愉快地继续下一行 有没有办法做到这一点而不需要制作一个看
  • 学习 Lisp 的资源 [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 什么是 S 表达式

    所有 Lisp 开发人员似乎都知道什么是 S 表达式 但有人能为非 Lisp 开发者解释一下这一点吗 已经有一个维基百科条目 https en wikipedia org wiki S expression https en wikiped
  • 具有类型推断功能的 Lisp 静态类型方言,适用于 Windows?

    是否有静态类型的 Lisp 方言可以执行类型推断并与 Windows 兼容 我找到了 CMUCL 但它似乎没有 Windows 兼容版本 看一下SBCL http www sbcl org它源自 CMUCL 它通过类型声明对静态类型提供良好
  • Lisp:使用语法糖访问递归哈希

    我正在尝试构建一个函数 或宏 来简化哈希表深处数据的获取和设置 也就是说 哈希中的哈希 哈希中的哈希等 我不认为我可以用宏来做到这一点 而且我不知道如何用 eval 来做到这一点 我希望能够执行以下操作 gethashdeep HEROES

随机推荐

  • windows升级node版本

    当本地的node版本过低的时候 这就需要升级更高版本来满足开发需求 本文详细教大家如何升级自己需要的node版本 1 官网 下载 Node js 中文网 下载找到需要升级的node版本 下载也默认只有长期支持版本和最新版本 如果满足需求 直
  • 2020 MCM Weekend 2 Problem C,2020美赛C题——完整版题目

    文章目录 Problem C A Wealth of Data Problem Requirements Glossary Data Set Definitions Problem C A Wealth of Data Problem In
  • 测试开发岗需要学习什么样的技能才能满足需求?也许通过阅读各个互联网大厂的JD你会更加清楚

    目录 前言 各大互联网厂关于测试开发的要求 实习 测试开发实习生 测试中心 B站 测试开发实习生 商业技术部 B站 测试开发实习生 直播 B站 测试开发工程师 实习 阿里 游戏测试开发工程师 实习 阿里 测试开发工程师 教育业务 实习 字节
  • 时间序列之指数平滑法(Exponential Smoothing)

    统计中 预测方法除了利用多个影响因素建立回归模型来做预测外 在影响因素复杂 或者是没办法得到相关影响因素的数据信息时 回归模型就无能为力了 如果数据是时间序列上的值 在时间上可能呈现一定的稳态或者规律 利用过去时间区间的值来预测未来值 指数
  • 关于Win2008系统DNS服务器安装配置操作教程

    DNS是因特网的一项核心服务 它作为可以将域名和IP地址相互映射的一个分布式数据库 能够使人更方便的访问互联网 而不用去记住能够被机器直接读取的IP 中文全称 网络协议 地址数串 在win2008系统中要成功安装DNS服务器才能够正常的连接
  • Python工程师的发展前景如何?薪资高吗?5点给你分析齐全

    根据网上的人爆料 2020 互联网大厂校招硕士生的薪资情况 和美团今年的校招信息发布 也是引起一波热潮 许多人看到这些薪资都会感叹一声 那真正处于技术岗位的人员又是另一种看法 同时也激起了许多人想学编程的想法 而目前较为火热的Python也
  • 可视化翻转教学python

    目录 第1关 绘制折线图 第2关 绘制正弦曲线 第3关 绘制指定线型 颜色和标记的正弦曲线 第4关 定义绘制正余弦函数曲线的函数 第5关 绘制坐标轴并设置范围 第1关 绘制折线图 显示绘制结果 plt show 用于显示绘制的结果 无参数
  • 华为OD机试 - 报数问题(Java)

    题目描述 有n个人围成一圈 顺序排号为1 n 从第一个人开始报数 从1到3报数 凡报到3的人退出圈子 问最后留下的是原来第几号的那位 输入描述 输入人数n n lt 1000 输出描述 输出最后留下的是原来第几号 用例 输入 2 输出 2
  • PHP 密码长度至少为8,且必须包含大小写字母/数字/符号任意三者组合

    密码长度至少为8 且必须包含大小写字母 数字 符号任意三者组合 public function rexCheckPassword pwd 12345678aaA 8 20 位 字母 数字 字符 密码必须包含大小写字母 数字 符号任意两者组合
  • 程序员必知的设计模式七大原则

    文章目录 设计模式的目的 1 单一职责原则 1 1 单一职责原则注意事项和细节 2 接口隔离原则 2 1 接口隔离原则例子 3 依赖倒转原则 3 1 什么是依赖 3 2 依赖关系传递的三种方式 1 接口传递 依赖 2 构造方法传递 组合 3
  • 用U深度启动U盘清除系统登入密码

    先添加一块硬盘 修改启动顺序 选择windows密码破解工具 选择选项1 出现了许多硬盘 一个一个去试SAM在那个硬盘 最后发现在硬盘2 出现以下界面 选择第一个用户 按y键保存并退出 在按esc键一直退到以下界面 输入r退出关闭计算机 把
  • Pytorch中常见transform的使用

    本次实验练习了pytorch中数据的读取 Dataset类的使用 以及transform模块的使用 一 Pytorch简介 PyTorch是一个开源的Python机器学习库 基于Torch 用于自然语言处理等应用程序 2017年1月 由Fa
  • python实战因子分析和主成分分析

    机器学习中 因子分析和主成分分析是模型降维的两种最常用方法 因子分析基础概念 因子分析是一种统计方法 可用于描述观察到的相关变量之间的变异性 即潜在的未观察到的变量数量可能更少 称为因子 例如 六个观察变量的变化可能主要反映了两个未观察 基
  • 剖析vue常见问题(四)之vue中的diff算法

    背景 首先diff算法不是vue的专属 只要采用虚拟dom的框架基本都会采用diff算法 那么为什么要采用diff算法呢以及diff算法的好处是什么呢 我们还以vue为例 从源码层面做下分析 分别说明一下diff算法的必要性 src cor
  • windows下MySQL免安装版配置教程mysql-5.7.23-winx64.zip版本

    windows下MySQL免安装版配置教程mysql 5 7 23 winx64 zip版本 上一篇我们讲了MySQL5 6 41免安装版的配置教程 5 7版本的MySQL的配置会有些许差异 第一步 下载MySQL 官网下载mysql 5
  • 总结:那些热门的开源游戏服务器框架,还不看你就out了

    前言 作为一名业内资深的游戏开发人员 经常会遇到实习的新同事在工作中会问到这样的问题 工作中到底有哪些开源游戏服务器框架 该去值得学习呢 囊括到node js java C golang c python 等技术栈有各种各样的游戏框架 本文
  • Hyperledger- Fabric环境搭建

    Hyperledger Fabric环境搭建 前言 这篇主要记录一下我搭建fabric开发环境的过程以及遇到的各种坑 一开始我是用windows 10家庭版进行配置的 然后照着官方文档的步骤进行 但是遇到了一系列困难 最终还是由于一个无法解
  • 手机连接服务器数据库文件,手机连接服务器数据库文件在哪里

    手机连接服务器数据库文件在哪里 内容精选 换一换 本章节适用于MRS 3 x之前版本 Loader支持以下多种连接 每种连接的配置介绍可根据本章节内容了解 obs connectorgeneric jdbc connectorftp con
  • C++智能指针详解(共享指针,唯一指针,自动指针)

    前言 智能指针在C 11中引入 分为三类 shared ptr 共享指针 unique ptr 唯一指针 auto ptr 自动指针 一 共享指针 几个共享指针可以指向同一个对象 每当shared ptr的最后一个所有者被销毁时 关联对象或
  • 300行Lisp根据语法和词法生成解析器

    1 概要 无 作者自闭中 2 代码 defun make token class name data list class name data defun make string scanner scanner spec lambda st