老古董Lisp实用主义入门教程(5):好奇先生用Lisp探索Lisp
鲁莽先生什么都不管
鲁莽先生打开电脑,安装一堆东西,噼里啪啦敲了一堆代码,叽里呱啦说了一堆话,然后累了就回家睡觉了。
这可把好奇先生的兴趣勾起来,他怎么也睡不着。好奇先生打开电脑,看了看鲁莽先生留下的代码和可执行文件,然后开始研究起来。
好奇先生第一次见到Lisp
好奇先生看到了一堆括号,他不知道这是什么,但是他知道这是一种编程语言,于是他开始查资料,了解到这是一种叫做Lisp的语言。
这个语言最大的特点就是括号,括号里面是函数名,括号外面是参数。因为括号很多,Lisp也被称为Lots of Irritating Silly Parentheses(许多令人烦恼的愚蠢括号)。
真是好玩啊!好奇先生想,真想要试试看。
好奇先生按照鲁莽先生的说明,安装SBCL,然后打开REPL,输入了一行代码:
This is SBCL 2.4.6, an implementation of ANSI Common Lisp.
More information about SBCL is available at <http://www.sbcl.org/>.SBCL is free software, provided as is, with absolutely no warranty.
It is mostly in the public domain; some portions are provided under
BSD-style licenses. See the CREDITS and COPYING files in the
distribution for more information.
* (+ 1 2)
3
好的,这下可以做加法啦!实际上,Lisp的加法可以加多个数:
(+ 1 2 3 4 5 6)
21
这不是很好理解吗?括号里面是一个列表,列表的第一个元素是+
,后面的元素是被加的数字。画出来就是这样的:
这不算什么,好奇先生想,我可以用Lisp来做更复杂的事情。
(+ 1 (* 2 3) (- 4 5))
6
再按照上面的方法画出来:
1 + 2 * 3 + (4 - 5) = 6 ,结果是6。其实很直观!
好奇先生觉得自己完全懂了:每个列表第一个元素是要干什么,后面的元素是对谁干。而且,后面的元素也可以是列表,这个列表的第一个元素同样是要干什么,后面的元素是对谁干。
好奇先生更好奇了
好奇先生觉得自己完全懂了,Lisp的代码就是一个括号套住的内容(包括括号本身),可以称为表达式(expression),表达式的左边一个括号,右边一个括号,中间是一个操作符(operator)和零个或多个操作数(operand)。
<left_parenthesis> = "("
<right_parenthesis> = ")"
<expression> ::= <left_parenthesis> <operator> <operand>* <right_parenthesis>
<operand> ::= <expression> | <???>
这个<operator>
是什么?这个<operand>
是什么?到底是几个?为什么还能是0个?这个<???>
是什么?好奇先生更好奇了。
好奇先生继续研究
好奇先生因为很好奇,早就学过无数种编程语言,他能理解这个<operator>
是一个函数或者方法或者操作符,比如+
、-
、*
、/
、sin
、cos
、tan
、sqrt
、log
、exp
等等。而这个<operand>
是一个值,或者一个变量。当然,无论是值或者变量,其实都有一个很本质的含义,就是内存中的一块区域,这个区域在某些程序设计语言中,表达为地址头、内存长度,这两个两可以完全定位这个区域。但是在Lisp中,到底是什么呢?
Lisp的数据类型
好奇先生查了一下,Lisp中貌似就只有两类大类数据类型:列表(list)和原子(atom)。
- 列表
- 由括号括起来的列表
- 列表的元素可以是列表
- 列表的元素可以是atom
listp
可以判断是否是列表
- Atom,中文直译为原子,在这里可以理解为不可再分的最小单位,比如:
- 数字,
numberp
可以判断是否是数字 - 字符串,
stringp
可以判断是否是字符串 - 符号,
symbolp
可以判断是否是符号 - 函数,
functionp
可以判断是否是函数
- 数字,
通过这些操作符(函数)就能够探索各种对象
的类型。好奇先生对自己的说法又有了亿点点更多的好奇。对象
?什么对象?Lisp里面操作的是什么?好奇先生继续研究。
Lisp中的字面量
字面量,就是直接表示的值,比如1
、"hello"
、'a
、t
、nil
、:my-key
等等。这些值是直接表示的,不需要计算,不需要解释,不需要转换,就是它们自己。实际上,这些值就是Lisp中基本被操作的对象
。并非是面向对象编程中的对象。
那么,跟C中间每个量实际上都是一块内存区域是否一样呢?好奇先生不停地问出新问题。
啊,问题太多了,太多啦!好奇先生觉得自己的好奇心已经被点燃了,他决定继续研究,继续探索,继续学习。
好奇先生工具箱
好奇先生每次到第一个新地方,总是最先想知道公共交通能到哪里,所以在打探一个新的编程语言时,他总是先找找有没有什么探索工具可以用。
比如上面的type-of
,以及哪些判断类型的命令。此外,lisp
还有一些其他的工具,比如:
list-all-packages
,可以列出所有的包do-external-symbols
,可以遍历一个包中的所有符号apropos
,可以找到一个符号的定义
好奇先生最喜欢这种工具箱!用这些工具,他就能探索这个SBCL世界!
packages
Common Lisp中的包(package)是一种组织符号的方式,可以把符号分组,然后通过包的名字来访问这些符号。比如,cl-user
包中有+
这个符号,那么我们可以通过cl-user:+
来访问这个符号。
(apropos 'list-all-packages);; LIST-ALL-PACKAGES (fbound)
;; NIL
好像没有提供太多的信息。
(list-all-packages);; (#<PACKAGE "QUICKLISP-CLIENT"> #<PACKAGE "UIOP/FILESYSTEM">
;; #<PACKAGE "ALIVE/SBCL/SYMBOLS"> #<PACKAGE "IMPL-SPECIFIC-GRAY">
;; #<PACKAGE "QL-IMPL"> #<PACKAGE "UIOP/DRIVER"> #<PACKAGE "ALIVE/INSPECTOR">
;; #<PACKAGE "SB-WALKER"> #<PACKAGE "ASDF/FIND-COMPONENT"> #<PACKAGE "SB-MOP">
;; #<PACKAGE "UIOP/PACKAGE"> #<PACKAGE "ASDF/BACKWARD-INTERNALS">
;; #<PACKAGE "ALIVE/LSP/TYPES/FORMAT-OPTIONS"> #<PACKAGE "QL-MKCL">
;; #<PACKAGE "SB-BIGNUM"> #<PACKAGE "ALIVE/PACKAGES">
;; #<PACKAGE "UIOP/BACKWARD-DRIVER"> #<PACKAGE "ALIVE/UTILS">
;; #<PACKAGE "UIOP/LAUNCH-PROGRAM"> #<PACKAGE "ALIVE/SBCL/THREADS">
;; #<PACKAGE "ASDF/FOOTER"> #<PACKAGE "ALIVE/SESSION"> #<PACKAGE "SB-REGALLOC">
;; #<PACKAGE "QL-CMUCL"> #<PACKAGE "SB-PCL"> #<PACKAGE "QL-CCL">
;; #<PACKAGE "SB-EXT"> #<PACKAGE "ASDF/OPERATE"> #<PACKAGE "ALIVE/RANGE">
;; #<PACKAGE "ALIVE/FILE"> #<PACKAGE "UIOP/RUN-PROGRAM">
;; #<PACKAGE "ALIVE/LSP/DEFINITION"> #<PACKAGE "ASDF/PARSE-DEFSYSTEM">
;; #<PACKAGE "ALIVE/LSP/COMPLETIONS"> #<PACKAGE "ALIVE/STREAMS">
;; #<PACKAGE "QL-DIST-USER"> #<PACKAGE "ALIVE/SBCL/FILE"> #<PACKAGE "QL-INFO">
;; #<PACKAGE "SB-SYS"> #<PACKAGE "QL-CONFIG"> #<PACKAGE "ALIVE/LSP/UTILS">
;; #<PACKAGE "ALIVE/SBCL/STREAMS"> #<PACKAGE "ALIVE/LSP/TYPES/SEM-TOKENS">
;; #<PACKAGE "SB-DISASSEM"> #<PACKAGE "BORDEAUX-THREADS">
;; #<PACKAGE "ALIVE/LSP/PACKET"> #<PACKAGE "ALIVE/LSP/MESSAGE/RESPONSE">
;; #<PACKAGE "SB-FASL"> #<PACKAGE "UIOP/UTILITY"> #<PACKAGE "JSON-SYSTEM">
;; #<PACKAGE "QL-SETUP"> #<PACKAGE "SB-POSIX"> #<PACKAGE "ALIVE/PARSE/TOKENIZER">
;; #<PACKAGE "ASDF/FIND-SYSTEM"> #<PACKAGE "SB-UNICODE">
;; #<PACKAGE "FLEXI-STREAMS-SYSTEM"> #<PACKAGE "ASDF/CONCATENATE-SOURCE">
;; #<PACKAGE "SB-DEBUG"> #<PACKAGE "ALIVE/FORMAT"> #<PACKAGE "QL-UTIL">
;; #<PACKAGE "SB-LOCKLESS"> #<PACKAGE "SB-ALIEN-INTERNALS">
;; #<PACKAGE "BORDEAUX-THREADS-2"> #<PACKAGE "SB-ALIEN">
;; #<PACKAGE "ALEXANDRIA-2"> #<PACKAGE "QL-SCL"> #<PACKAGE "ASDF/USER">
;; #<PACKAGE "ALIVE/TYPES"> #<PACKAGE "ALIVE/THREADS">
;; #<PACKAGE "SPLIT-SEQUENCE"> #<PACKAGE "ASDF/COMPONENT">
;; #<PACKAGE "ASDF/FORCING"> #<PACKAGE "QL-GUNZIPPER"> #<PACKAGE "SB-INTROSPECT">
;; #<PACKAGE "UIOP/STREAM"> #<PACKAGE "ASDF/PACKAGE-INFERRED-SYSTEM">
;; #<PACKAGE "SB-PRETTY"> #<PACKAGE "ASDF/SOURCE-REGISTRY">
;; #<PACKAGE "SB-SEQUENCE"> #<PACKAGE "ASDF/SYSTEM-REGISTRY">
;; #<PACKAGE "SB-APROF"> #<PACKAGE "ALIVE/POSITION"> #<PACKAGE "SB-PROFILE">
;; #<PACKAGE "ALIVE/COMPILE-MESSAGE"> #<PACKAGE "ALEXANDRIA">
;; #<PACKAGE "UIOP/OS"> #<PACKAGE "QL-NETWORK"> #<PACKAGE "ASDF/LISP-ACTION">
;; #<PACKAGE "ALIVE/LSP/HOVER"> #<PACKAGE "ALIVE/LSP/SYMBOL">
;; #<PACKAGE "ASDF/PLAN"> #<PACKAGE "ALIVE/LOGGER"> #<PACKAGE "SB-C">
;; #<PACKAGE "QL-BUNDLE"> #<PACKAGE "UIOP/PATHNAME"> #<PACKAGE "SB-BSD-SOCKETS">
;; #<PACKAGE "ALIVE/TEXT-EDIT"> #<PACKAGE "ASDF/SESSION"> #<PACKAGE "JSON">
;; #<PACKAGE "ALIVE/SELECTION"> #<PACKAGE "QL-HTTP"> #<PACKAGE "ASDF/INTERFACE">
;; #<PACKAGE "ASDF/OUTPUT-TRANSLATIONS"> #<PACKAGE "ALIVE/LSP/PARSE">
;; #<PACKAGE "QL-MINITAR"> #<PACKAGE "ASDF/ACTION"> #<PACKAGE "UIOP/VERSION">
;; #<PACKAGE "ALIVE/LSP/MESSAGE/REQUEST"> #<PACKAGE "SB-THREAD">
;; #<PACKAGE "QL-SBCL"> #<PACKAGE "ASDF/BUNDLE"> #<PACKAGE "KEYWORD">
;; #<PACKAGE "ALIVE/EVAL"> #<PACKAGE "ALIVE/PARSE/FORMS">
;; #<PACKAGE "ALIVE/LSP/MESSAGE/ABSTRACT"> #<PACKAGE "SB-LOOP">
;; #<PACKAGE "SB-DI"> #<PACKAGE "SB-UNIX"> #<PACKAGE "UIOP/CONFIGURATION">
;; #<PACKAGE "UIOP/IMAGE"> #<PACKAGE "SB-IMPL"> #<PACKAGE "SB-GRAY">
;; #<PACKAGE "COMMON-LISP-USER"> #<PACKAGE "SB-BROTHERTREE">
;; #<PACKAGE "ASDF/OPERATION"> #<PACKAGE "ALIVE/DEBUGGER">
;; #<PACKAGE "QL-IMPL-UTIL"> #<PACKAGE "ALIVE/PARSE/TOKEN">
;; #<PACKAGE "ALIVE/LSP/SEM-ANALYSIS"> #<PACKAGE "ALIVE/MACROS">
;; #<PACKAGE "QL-LISPWORKS"> #<PACKAGE "SB-VM"> #<PACKAGE "GLOBAL-VARS">
;; #<PACKAGE "SB-ASSEM"> #<PACKAGE "UIOP/COMMON-LISP">
;; #<PACKAGE "ALIVE/LSP/TYPES/CONFIG-ITEM"> #<PACKAGE "TRIVIAL-GARBAGE">
;; #<PACKAGE "ASDF/BACKWARD-INTERFACE"> #<PACKAGE "ALIVE/LSP/TYPES/RESTART-INFO">
;; #<PACKAGE "SB-FORMAT"> #<PACKAGE "ASDF/UPGRADE"> #<PACKAGE "SB-INT">
;; #<PACKAGE "QL-CLISP"> #<PACKAGE "USOCKET"> #<PACKAGE "ALIVE/PARSE/FORM">
;; #<PACKAGE "ALIVE/LSP/MESSAGE/NOTIFICATION"> #<PACKAGE "SB-WIN32">
;; #<PACKAGE "ALIVE/SYMBOLS"> #<PACKAGE "SB-EVAL"> #<PACKAGE "SB-X86-64-ASM">
;; #<PACKAGE "QL-MEZZANO"> #<PACKAGE "QL-PROGRESS"> #<PACKAGE "QL-ALLEGRO">
;; #<PACKAGE "COMMON-LISP"> #<PACKAGE "ALIVE/SERVER">
;; #<PACKAGE "ALIVE/LSP/MESSAGE/FORMAT-UTILS"> #<PACKAGE "QL-CDB">
;; #<PACKAGE "ALIVE/ERRORS"> #<PACKAGE "ALIVE/FRAMES"> #<PACKAGE "JSON-RPC">
;; #<PACKAGE "QL-CLASP"> #<PACKAGE "UIOP/LISP-BUILD"> #<PACKAGE "SB-KERNEL">
;; #<PACKAGE "FLEXI-STREAMS"> #<PACKAGE "TRIVIAL-GRAY-STREAMS">
;; #<PACKAGE "ASDF/SYSTEM"> #<PACKAGE "QL-DIST"> #<PACKAGE "ALIVE/LSP/ERRORS">
;; #<PACKAGE "QL-ECL"> #<PACKAGE "ALIVE/ASDF">
;; #<PACKAGE "SB-BSD-SOCKETS-INTERNAL"> #<PACKAGE "QL-ABCL">)
原来好奇先生已经安装这么多有用的(或者没用的)包。
还可以自己定义一个包,并且看看自己定义的包是不是能被找到。好奇先生看到结果,高兴得不得了。
(let ((before (list-all-packages))) (make-package 'temp) (set-difference (list-all-packages) before));; (#<PACKAGE "TEMP">)
当然,我们还可以查找一个包,这里用的是find-package
。
(find-package 'cl-user)
(find-package :cl-user)
(find-package "CL-USER")
这三种形式都可以,只是注意,最后那个用字符串的方式,必须是大写的。太麻烦,好奇先生动动手指,写了一个函数。
(defun find-package-ignore-case (name)"Find a package by name, ignoring case"(if (stringp name)(find-package (string-upcase name))(find-package name)))
这下子,就可以直接忽视大小写了。那么,能不能用一个包的名字的一部分来查找一个包呢?好奇先生又动动手指,写了一个函数。
(defun part-in-list-p (part list)"Return true if any element of list contains part"(find-if (lambda (x) (search part x)) list))(defun find-package-with-part (part)"Find a package by part of its name or nickname"(let ((result '())(part-upcase (string-upcase part)))(dolist (package (list-all-packages))(if (or (search part-upcase (package-name package))(part-in-list-p part-upcase (package-nicknames package)))(push package result)))result))
第一个函数,用来在一个列表中找到是否包含一个字符串,如果包含,就返回真。第二个函数,用来查找一个包的名字或者别名中是否包含一个字符串。
(find-package-with-part "cl")
; (#<PACKAGE "QL-ABCL"> #<PACKAGE "QL-ECL"> #<PACKAGE "QL-CLASP">
; #<PACKAGE "COMMON-LISP"> #<PACKAGE "QL-CLISP"> #<PACKAGE "UIOP/COMMON-LISP">
; #<PACKAGE "COMMON-LISP-USER"> #<PACKAGE "QL-SBCL"> #<PACKAGE "JSON">
; #<PACKAGE "QL-SCL"> #<PACKAGE "ALIVE/SBCL/STREAMS">
; #<PACKAGE "ALIVE/SBCL/FILE"> #<PACKAGE "QL-CCL"> #<PACKAGE "SB-PCL">
; #<PACKAGE "QL-CMUCL"> #<PACKAGE "ALIVE/SBCL/THREADS"> #<PACKAGE "QL-MKCL">
; #<PACKAGE "ALIVE/SBCL/SYMBOLS"> #<PACKAGE "QUICKLISP-CLIENT">)
现在,好奇先生对自己系统中的包了如指掌,完全满足了他的部分好奇心,因为好奇先生的好奇先生是无穷无尽的!知道自己的系统中有这么多包之后,好奇先生的好奇心简直要爆炸了,每个包里到底有什么?
包里有什么呢?当然是symbols
粗鲁先生看到好奇先生噼里啪啦地敲着键盘,嘴里念念有词,突然听到一句”包里有什么呢?“,他大声回答:“当然是符号啦!”好奇先生听到这个回答,觉得很有道理,于是他开始查找一个包里面的所有符号。
;; list all external symbols in a package
(defun dir (package)(let ((result '())(len 0))(do-external-symbols (s package (values result len)); (format t "~a~%" s)(push s result)(incf len))))
因为这就像是列出一个目录的文件,好奇先生当然把这个函数命名为dir
。
(dir (find-package 'cl))
; (READ-BYTE FIND-PACKAGE ROUND LET* +++ COPY-SYMBOL BREAK ARRAY
; LISP-IMPLEMENTATION-TYPE PPRINT-FILL REMHASH FILE-LENGTH FLOOR
; MOST-POSITIVE-LONG-FLOAT STRING= BOOLE-C1 LOGNAND BIT-IOR
; SYNONYM-STREAM-SYMBOL STANDARD-GENERIC-FUNCTION
; GET-INTERNAL-REAL-TIME DESCRIBE-OBJECT IN-PACKAGE SET
; *COMPILE-FILE-PATHNAME* ISQRT PROBE-FILE UNION VECTOR MEMBER-IF-NOT
; LOGBITP STREAM-ERROR-STREAM APPEND NSUBLIS PATHNAME
; SET-DISPATCH-MACRO-CHARACTER CDAADR PROG SYNONYM-STREAM CONJUGATE
; LOGTEST SPECIAL NIL DOUBLE-FLOAT-EPSILON SHADOW TRACE SYMBOL-PLIST
; CADAR DELETE-FILE COPY-ALIST PATHNAME-DIRECTORY SIN SHIFTF
; STANDARD-METHOD TYPE PROG1 FLOAT-SIGN BIT-AND PLUSP COMPILER-MACRO
; NOT STREAM-ELEMENT-TYPE CADDDR STRING<= ADJOIN REMPROP CHAR-EQUAL
; RETURN-FROM LEAST-POSITIVE-NORMALIZED-SHORT-FLOAT BOOLE-CLR LCM
; POSITION HANDLER-CASE COMPUTE-APPLICABLE-METHODS DEFMETHOD BOOLE-1
; CONTROL-ERROR CLASS CHAR-LESSP DELETE-PACKAGE
; BROADCAST-STREAM-STREAMS LEAST-POSITIVE-NORMALIZED-DOUBLE-FLOAT NULL
; FIFTH EXP WITH-OUTPUT-TO-STRING FTRUNCATE LAST STRING-CAPITALIZE
; MAPCON CDDDDR LOGORC2 PRINT-OBJECT >= USER-HOMEDIR-PATHNAME
; *MODULES* CAAADR SLOT-MISSING RATIONALIZE TANH BIT-EQV ///
; ROW-MAJOR-AREF *LOAD-PATHNAME* *PRINT-ESCAPE* READTABLE-CASE NCONC
; BOOLE-2 STANDARD-CLASS SIMPLE-BIT-VECTOR COUNT-IF BOOLE-SET
; DEFPARAMETER ZEROP DYNAMIC-EXTENT FILE-STRING-LENGTH STRUCTURE
; RPLACD SET-MACRO-CHARACTER CHAR/= SYMBOL-MACROLET CAAAR // *PACKAGE*
; WITH-OPEN-FILE DEFSTRUCT TWO-WAY-STREAM ASSOC-IF-NOT SHORT-FLOAT
; EXTENDED-CHAR < READ-CHAR-NO-HANG LOGAND ECHO-STREAM-INPUT-STREAM T
; CHAR< FUNCTION BOOLE-ORC2 *MACROEXPAND-HOOK* STRING/= FBOUNDP /
; RASSOC EVAL-WHEN CLRHASH WARN AND LISTEN RANDOM-STATE
; SPECIAL-OPERATOR-P SYMBOL-PACKAGE COMPILATION-SPEED *LOAD-PRINT*
; PPRINT-POP SEARCH LONG-FLOAT-EPSILON *TERMINAL-IO* CDDDAR
; ADJUST-ARRAY MAKE-PATHNAME KEYWORD MERGE NO-APPLICABLE-METHOD
; *PRINT-PPRINT-DISPATCH* VECTOR-POP SEQUENCE BIGNUM POP CHAR SETQ MOD
; SIMPLE-STRING-P CERROR MAKE-ECHO-STREAM STRING-NOT-LESSP
; *PRINT-BASE* UPDATE-INSTANCE-FOR-DIFFERENT-CLASS
; FLOATING-POINT-UNDERFLOW HASH-TABLE-REHASH-THRESHOLD INCF LDB-TEST
; LIST MEMBER-IF ARRAY-HAS-FILL-POINTER-P OPEN-STREAM-P THIRD &WHOLE
; BIT-NOT GENSYM CCASE BOOLE-XOR SET-SYNTAX-FROM-CHAR DOLIST
; ALPHANUMERICP STRING-STREAM MOST-NEGATIVE-SINGLE-FLOAT ELT TRUENAME
; NSTRING-DOWNCASE LEAST-POSITIVE-NORMALIZED-SINGLE-FLOAT *READ-BASE*
; NSET-DIFFERENCE THROW PHASE THE BIT-ANDC1 ASSERT ACOS
; WILD-PATHNAME-P CDR DIGIT-CHAR-P MACROEXPAND-1 NSET-EXCLUSIVE-OR
; TYPECASE PPRINT-INDENT CDADR CLASS-NAME COMPILE-FILE-PATHNAME
; FDEFINITION RASSOC-IF APROPOS-LIST INTEGER-LENGTH *READ-SUPPRESS*
; UNLESS NSTRING-CAPITALIZE FTYPE BUILT-IN-CLASS ** MAKE-CONDITION
; STRING ENCODE-UNIVERSAL-TIME BIT-ANDC2 HASH-TABLE-SIZE CELL-ERROR
; ATANH RATIONALP NAME-CHAR SET-DIFFERENCE BIT-NAND CONDITION
; CHAR-GREATERP &OPTIONAL DISASSEMBLE ERROR CADDR SAFETY CHAR-CODE
; WARNING ENDP *PRINT-RADIX* STANDARD-OBJECT MAPCAN PATHNAMEP
; TWO-WAY-STREAM-OUTPUT-STREAM FMAKUNBOUND ARRAY-ROW-MAJOR-INDEX
; SUBSEQ LOAD DELETE-IF-NOT UNBOUND-SLOT-INSTANCE LOGORC1 OPTIMIZE
; STRING< STABLE-SORT NSUBSTITUTE DIGIT-CHAR ENOUGH-NAMESTRING
; BYTE-POSITION PPRINT-LOGICAL-BLOCK SUBSTITUTE-IF TAILP
; FLOATING-POINT-INEXACT EQL FIND-METHOD FLET ARRAY-TOTAL-SIZE-LIMIT
; UNUSE-PACKAGE RATIO LEAST-NEGATIVE-NORMALIZED-LONG-FLOAT
; GET-DISPATCH-MACRO-CHARACTER MAKE-SEQUENCE NBUTLAST NRECONC MACROLET
; CHAR<= MINUSP PRINT-UNREADABLE-OBJECT LOWER-CASE-P STANDARD
; HASH-TABLE-COUNT FLOAT-PRECISION REVAPPEND CALL-ARGUMENTS-LIMIT
; READ-FROM-STRING UNDEFINED-FUNCTION COPY-READTABLE ASIN
; DEFINE-SETF-EXPANDER HANDLER-BIND
; LEAST-POSITIVE-NORMALIZED-LONG-FLOAT PPRINT-TAB NUNION REALP
; POSITION-IF BOOLE-ANDC1 ABORT NUMBER DECLAIM COMPILED-FUNCTION-P
; PACKAGE-USED-BY-LIST CHAR-NOT-LESSP WITH-INPUT-FROM-STRING
; SIMPLE-WARNING STORE-VALUE *COMPILE-VERBOSE* DELETE-DUPLICATES
; MOST-NEGATIVE-FIXNUM DELETE AREF DEFUN STREAM-ERROR BOOLE-C2
; PPRINT-LINEAR MULTIPLE-VALUE-SETQ FILE-STREAM STRING-TRIM
; REMOVE-IF-NOT UNREAD-CHAR OTHERWISE DESCRIBE RPLACA WRITE-SEQUENCE
; MIN SOFTWARE-VERSION *PRINT-LEVEL* SECOND CHECK-TYPE PPRINT BUTLAST
; BASE-CHAR COMPLEXP PATHNAME-NAME SLOT-UNBOUND ODDP PRIN1-TO-STRING
; STRING-RIGHT-TRIM COMPILE-FILE ++ FILE-ERROR-PATHNAME PRINC
; GET-PROPERTIES MOST-POSITIVE-FIXNUM MAKE-LOAD-FORM-SAVING-SLOTS
; REALPART DIRECTORY CDADAR CONSTANTLY
; FLOATING-POINT-INVALID-OPERATION NOTANY PATHNAME-MATCH-P DECF MEMBER
; MULTIPLE-VALUE-PROG1 DEFGENERIC IDENTITY CHAR-CODE-LIMIT VECTOR-PUSH
; DEFINE-SYMBOL-MACRO + GETF LEAST-NEGATIVE-LONG-FLOAT CHAR-DOWNCASE
; LEAST-NEGATIVE-DOUBLE-FLOAT SINGLE-FLOAT-NEGATIVE-EPSILON
; ADJUSTABLE-ARRAY-P SUBTYPEP *FEATURES* NUMBERP FILE-ERROR
; POSITION-IF-NOT > DEFPACKAGE PPRINT-DISPATCH
; MOST-POSITIVE-SINGLE-FLOAT SUBSTITUTE-IF-NOT COMPILED-FUNCTION LOG
; DO* PARSE-INTEGER SIMPLE-ERROR LEAST-NEGATIVE-SINGLE-FLOAT
; DEFINE-COMPILER-MACRO LOGANDC2 KEYWORDP FIND-ALL-SYMBOLS BIT-ORC1
; *PRINT-CIRCLE* ARRAY-DIMENSION-LIMIT CAAR SPACE DOCUMENTATION
; UPGRADED-COMPLEX-PART-TYPE STREAM PROGRAM-ERROR PUSHNEW MASK-FIELD
; CHARACTERP LDIFF DIRECTORY-NAMESTRING LOOP-FINISH DPB
; CHAR-NOT-GREATERP LENGTH LEAST-NEGATIVE-NORMALIZED-SINGLE-FLOAT
; DRIBBLE SLOT-VALUE PPRINT-TABULAR SIMPLE-BASE-STRING SIGNED-BYTE
; PACKAGE-ERROR-PACKAGE DEFINE-MODIFY-MACRO SHORT-SITE-NAME
; ARRAY-RANK-LIMIT CODE-CHAR FUNCALL DEPOSIT-FIELD MAKE-ARRAY ED
; COPY-PPRINT-DISPATCH BIT-ORC2 LOGICAL-PATHNAME FIND-SYMBOL
; WRITE-STRING DO WRITE-BYTE CHAR-NOT-EQUAL MAPLIST BOOLEAN
; ECHO-STREAM MAPL NSUBST-IF DEFTYPE EVAL USE-VALUE
; TRANSLATE-LOGICAL-PATHNAME PRINT-NOT-READABLE-OBJECT PROG2
; SUBSTITUTE *PRINT-PRETTY* TENTH FFLOOR STRING-NOT-EQUAL
; INVOKE-RESTART-INTERACTIVELY /= DO-SYMBOLS MAP-INTO CTYPECASE
; MULTIPLE-VALUE-BIND FOURTH CAADR MOST-NEGATIVE-SHORT-FLOAT &BODY
; BOOLE *TRACE-OUTPUT* LOAD-LOGICAL-PATHNAME-TRANSLATIONS
; SHORT-FLOAT-NEGATIVE-EPSILON ACOSH ALPHA-CHAR-P SIMPLE-ARRAY
; PACKAGE-NAME RANDOM APROPOS DEBUG HASH-TABLE-P OR INVOKE-DEBUGGER
; PRINT-NOT-READABLE CHAR-INT MAKE-SYNONYM-STREAM
; MAKE-DISPATCH-MACRO-CHARACTER SIMPLE-BIT-VECTOR-P COUNT FILL
; IGNORE-ERRORS LEAST-NEGATIVE-NORMALIZED-SHORT-FLOAT
; LOGICAL-PATHNAME-TRANSLATIONS DO-ALL-SYMBOLS REVERSE MAKUNBOUND SOME
; DECODE-UNIVERSAL-TIME SHORT-FLOAT-EPSILON COMPILER-MACRO-FUNCTION
; RETURN PATHNAME-VERSION SUBLIS FIND-IF *STANDARD-INPUT*
; MAKE-INSTANCE CLEAR-INPUT SINGLE-FLOAT-EPSILON MAKE-SYMBOL IMPORT
; *PRINT-GENSYM* LET CADDAR BIT-VECTOR NSTRING-UPCASE
; UPGRADED-ARRAY-ELEMENT-TYPE MULTIPLE-VALUE-LIST NUMERATOR =
; SIMPLE-VECTOR-P SCALE-FLOAT ARITHMETIC-ERROR-OPERANDS PROG*
; BOOLE-NAND UNTRACE INPUT-STREAM-P PSETF READTABLE METHOD-QUALIFIERS
; FILE-POSITION USE-PACKAGE SYMBOL-VALUE NEXT-METHOD-P SIMPLE-STRING
; GRAPHIC-CHAR-P STREAMP CDDAAR CALL-NEXT-METHOD
; MOST-NEGATIVE-DOUBLE-FLOAT FILE-AUTHOR WHEN TYPE-OF BIT-NOR CHAR>
; SINGLE-FLOAT ENSURE-GENERIC-FUNCTION PI *RANDOM-STATE* PSETQ EQ
; HASH-TABLE EVENP *PRINT-RIGHT-MARGIN* OPEN REQUIRE GENTEMP
; *READTABLE* MAKE-STRING-OUTPUT-STREAM CDAR LOGEQV DEFINE-CONDITION
; CLASS-OF SIMPLE-CONDITION-FORMAT-CONTROL STANDARD-CHAR PACKAGE-ERROR
; LOAD-TIME-VALUE PACKAGE 1- PROGV STORAGE-CONDITION <= FORMATTER
; FILE-WRITE-DATE BOOLE-NOR UPDATE-INSTANCE-FOR-REDEFINED-CLASS TAN
; END-OF-FILE IMAGPART BIT-VECTOR-P EQUAL FIND-CLASS DEFMACRO Y-OR-N-P
; REST PATHNAME-DEVICE FUNCTION-KEYWORDS SET-EXCLUSIVE-OR NAMESTRING
; HASH-TABLE-REHASH-SIZE GET-DECODED-TIME *COMPILE-PRINT*
; CELL-ERROR-NAME INTEGERP ABS FLOAT-DIGITS SIMPLE-VECTOR
; MOST-NEGATIVE-LONG-FLOAT FIND-RESTART IF REMF
; DEFINE-METHOD-COMBINATION SHADOWING-IMPORT COMPLEX GO
; WITH-HASH-TABLE-ITERATOR SET-PPRINT-DISPATCH CONCATENATED-STREAM
; TYPE-ERROR-DATUM SLOT-MAKUNBOUND LEAST-POSITIVE-SINGLE-FLOAT
; MAKE-INSTANCES-OBSOLETE SORT NSUBST PRINC-TO-STRING
; TYPE-ERROR-EXPECTED-TYPE VALUES-LIST YES-OR-NO-P FLOAT-RADIX SIGNUM
; READ-SEQUENCE *BREAK-ON-SIGNALS* MULTIPLE-VALUES-LIMIT CONCATENATE
; PPRINT-NEWLINE COPY-TREE &REST &ENVIRONMENT METHOD-COMBINATION-ERROR
; *GENSYM-COUNTER* STRUCTURE-CLASS ETYPECASE PARSE-ERROR
; STRING-DOWNCASE * MAP SUBST-IF *DEBUG-IO* STRING-LEFT-TRIM SYMBOL
; LONG-FLOAT-NEGATIVE-EPSILON PAIRLIS STRINGP LOOP LOGIOR VECTORP
; BROADCAST-STREAM WITH-SLOTS CATCH MAKE-RANDOM-STATE FORMAT COPY-SEQ
; STRING-LESSP APPLY REM CALL-METHOD IGNORE CONSP SYMBOLP
; *PRINT-LENGTH* READ-DELIMITED-LIST SBIT READER-ERROR RESTART-CASE
; PPRINT-EXIT-IF-LIST-EXHAUSTED FUNCTION-LAMBDA-EXPRESSION SIXTH FIND
; SYMBOL-FUNCTION LOGNOT TRANSLATE-PATHNAME VALUES MACHINE-INSTANCE
; STRING-UPCASE CADADR PEEK-CHAR *PRINT-READABLY* RESTART-BIND ASSOC
; INTERACTIVE-STREAM-P SINH CDDAR UNBOUND-SLOT STRING> GCD PACKAGEP
; UPPER-CASE-P TRUNCATE RENAME-FILE CADAAR BOOLE-IOR
; INITIALIZE-INSTANCE MAKE-STRING STANDARD-CHAR-P &AUX NSUBSTITUTE-IF
; DECLARE CDDR CLOSE ARRAY-DISPLACEMENT WRITE INTEGER CHAR>= VARIABLE
; MERGE-PATHNAMES WITH-SIMPLE-RESTART BYTE-SIZE ASH COMPILE IGNORABLE
; NOTEVERY MISMATCH INVALID-METHOD-ERROR FORCE-OUTPUT
; REMOVE-DUPLICATES UNSIGNED-BYTE MAKE-METHOD RESTART-NAME BOOLE-AND
; FINISH-OUTPUT UNWIND-PROTECT BOOLE-EQV *PRINT-CASE* WITH-ACCESSORS
; *PRINT-ARRAY* SVREF ARRAY-DIMENSIONS - METHOD DEFVAR SEVENTH
; MOST-POSITIVE-DOUBLE-FLOAT REMOVE-METHOD PATHNAME-TYPE TIME BOUNDP
; LAMBDA-PARAMETERS-LIMIT ROTATEF LONG-SITE-NAME LOCALLY
; DIVISION-BY-ZERO SLOT-BOUNDP SIMPLE-CONDITION BOTH-CASE-P
; GET-MACRO-CHARACTER LIST-ALL-PACKAGES STRUCTURE-OBJECT MAKE-LIST
; SIMPLE-CONDITION-FORMAT-ARGUMENTS BOOLE-ORC1 MAKE-HASH-TABLE
; FIND-IF-NOT COPY-LIST CEILING GETHASH BYTE
; CONCATENATED-STREAM-STREAMS DELETE-IF *QUERY-IO* PUSH
; FLOATING-POINT-OVERFLOW ROOM TYPEP FRESH-LINE PRINT REMOVE NREVERSE
; MAPHASH DO-EXTERNAL-SYMBOLS ECHO-STREAM-OUTPUT-STREAM COND NTH LISTP
; FLOAT ARRAYP SHARED-INITIALIZE ASSOC-IF EQUALP ALLOCATE-INSTANCE BIT
; BOOLE-ANDC2 HOST-NAMESTRING CONS BASE-STRING
; ARITHMETIC-ERROR-OPERATION NSUBSTITUTE-IF-NOT RANDOM-STATE-P
; NSUBST-IF-NOT READ-LINE READ-CHAR TERPRI MAKE-BROADCAST-STREAM
; SUBSETP MULTIPLE-VALUE-CALL MAKE-LOAD-FORM STRING-EQUAL
; VECTOR-PUSH-EXTEND MAKE-STRING-INPUT-STREAM TREE-EQUAL CAADDR GET
; EXPT CONTINUE LEAST-POSITIVE-LONG-FLOAT TAGBODY STRING-NOT-GREATERP
; OUTPUT-STREAM-P BIT-XOR CLEAR-OUTPUT RASSOC-IF-NOT
; REINITIALIZE-INSTANCE SXHASH SIMPLE-TYPE-ERROR
; LEAST-POSITIVE-SHORT-FLOAT INVOKE-RESTART RESTART EXPORT QUOTE
; ADD-METHOD PACKAGE-USE-LIST COPY-STRUCTURE TYPE-ERROR
; PARSE-NAMESTRING PATHNAME-HOST READ-PRESERVING-WHITESPACE CASE
; ARRAY-TOTAL-SIZE INSPECT LIST* COMPUTE-RESTARTS DEFCONSTANT
; DENOMINATOR PROCLAIM MACHINE-VERSION LONG-FLOAT CDADDR CAR READ
; MAKE-TWO-WAY-STREAM GENERIC-FUNCTION DEFSETF LABELS ATAN
; ARRAY-ELEMENT-TYPE PACKAGE-SHADOWING-SYMBOLS COUNT-IF-NOT
; ARITHMETIC-ERROR MOST-POSITIVE-SHORT-FLOAT CDDADR LDB
; HASH-TABLE-TEST *DEFAULT-PATHNAME-DEFAULTS* LAMBDA
; LEAST-NEGATIVE-NORMALIZED-DOUBLE-FLOAT MACRO-FUNCTION
; WRITE-TO-STRING REPLACE REMOVE-IF SUBST-IF-NOT ARRAY-RANK MAX INLINE
; LOGXOR INTERNAL-TIME-UNITS-PER-SECOND NTH-VALUE
; DOUBLE-FLOAT-NEGATIVE-EPSILON COSH SCHAR NINTERSECTION SATISFIES
; REDUCE ECASE INTERN CDAAR LOGNOR *** INTERSECTION SPEED STRING>=
; DECLARATION *LOAD-VERBOSE* *PRINT-LINES* LEAST-POSITIVE-DOUBLE-FLOAT
; RATIONAL UNBOUND-VARIABLE CHAR-UPCASE FILL-POINTER SLEEP PRIN1 1+
; COMPLEMENT INTEGER-DECODE-FLOAT EVERY RENAME-PACKAGE
; GET-INTERNAL-RUN-TIME UNEXPORT STREAM-EXTERNAL-FORMAT
; ARRAY-IN-BOUNDS-P WITH-PACKAGE-ITERATOR LISP-IMPLEMENTATION-VERSION
; CAADAR DOTIMES CIS ENSURE-DIRECTORIES-EXIST CHAR-NAME MUFFLE-WARNING
; *DEBUGGER-HOOK* FIRST ASINH CONSTANTP DOUBLE-FLOAT
; *READ-DEFAULT-FLOAT-FORMAT* DEFCLASS STEP METHOD-COMBINATION
; WITH-CONDITION-RESTARTS PROVIDE *STANDARD-OUTPUT* MACHINE-TYPE NINTH
; SQRT COS LOGANDC1 PACKAGE-NICKNAMES FUNCTIONP NO-NEXT-METHOD MAPC
; CHARACTER CDDDR NOTINLINE MAKE-CONCATENATED-STREAM REAL CDAAAR
; GET-SETF-EXPANSION SLOT-EXISTS-P BLOCK WRITE-LINE CHANGE-CLASS SUBST
; WRITE-CHAR READTABLEP NTHCDR SOFTWARE-TYPE
; TWO-WAY-STREAM-INPUT-STREAM MAKE-PACKAGE ACONS
; LEAST-NEGATIVE-SHORT-FLOAT FLOATP CAAAAR MAPCAR LOGCOUNT ATOM
; FCEILING ARRAY-DIMENSION DECODE-FLOAT SERIOUS-CONDITION SYMBOL-NAME
; STRING-GREATERP SIGNAL *ERROR-OUTPUT* *COMPILE-FILE-TRUENAME*
; FILE-NAMESTRING *PRINT-MISER-WIDTH* UNINTERN GET-UNIVERSAL-TIME
; LIST-LENGTH CADR FIXNUM WITH-STANDARD-IO-SYNTAX WITH-OPEN-STREAM
; DESTRUCTURING-BIND *LOAD-TRUENAME* FROUND WITH-COMPILATION-UNIT
; EIGHTH SETF &KEY PROGN LAMBDA-LIST-KEYWORDS STYLE-WARNING
; &ALLOW-OTHER-KEYS CHAR= MACROEXPAND GET-OUTPUT-STREAM-STRING COERCE
; *READ-EVAL*)
;
(nth-value 1 (dir (find-package 'cl)))
; 978
天啦天啦天啦,这个common-lisp
包里居然有978个可供外部访问的符号!好奇先生简直要疯了!
好奇先生想要对每一个符号使用describe
,并且把所有的符号都输出到一个文件里,于是他写了一个函数。
;; print all symbols and doc strings in a file
(defun dir-package (package)"List all external symbols in a package and their doc strings in a file"(let ((sorted-names (sort (dir package) #'string<))(fn (format nil "~a.md" package)))(with-open-stream (s (open fn :direction :output :if-exists :supersede));; header line(format s "# ~a external symbols~%~%~%" package);; list all external symbols (let ((index 1))(dolist (name sorted-names)(format s "~d. [~A](#~A)~%" index name name)(incf index)))(format s "~%~%");; describe all external symbols(dolist (name sorted-names)(format s "## `~a`~%~%" name)(format s "```lisp~%")(describe name s)(format s "```~%")))))
这下好了,好奇先生有一个markdown
文件,里面包含了所有的符号和他们的文档字符串。好奇先生对这个文件简直是爱不释手。
# CL external symbols1. [&ALLOW-OTHER-KEYS](#&ALLOW-OTHER-KEYS)
2. [&AUX](#&AUX)
3. [&BODY](#&BODY)
4. [&ENVIRONMENT](#&ENVIRONMENT)
5. [&KEY](#&KEY)
6. [&OPTIONAL](#&OPTIONAL)
7. [&REST](#&REST)
8. [&WHOLE](#&WHOLE)
9. [*](#*)
10. [**](#**)
11. [***](#***)
12. [*BREAK-ON-SIGNALS*](#*BREAK-ON-SIGNALS*)
13. [*COMPILE-FILE-PATHNAME*](#*COMPILE-FILE-PATHNAME*)
14. [*COMPILE-FILE-TRUENAME*](#*COMPILE-FILE-TRUENAME*)
15. [*COMPILE-PRINT*](#*COMPILE-PRINT*)
16. [*COMPILE-VERBOSE*](#*COMPILE-VERBOSE*)
17. [*DEBUG-IO*](#*DEBUG-IO*)
18. [*DEBUGGER-HOOK*](#*DEBUGGER-HOOK*)
19. [*DEFAULT-PATHNAME-DEFAULTS*](#*DEFAULT-PATHNAME-DEFAULTS*)
20. [*ERROR-OUTPUT*](#*ERROR-OUTPUT*)
21. [*FEATURES*](#*FEATURES*)
22. [*GENSYM-COUNTER*](#*GENSYM-COUNTER*)
23. [*LOAD-PATHNAME*](#*LOAD-PATHNAME*)
24. [*LOAD-PRINT*](#*LOAD-PRINT*)
25. [*LOAD-TRUENAME*](#*LOAD-TRUENAME*)
26. [*LOAD-VERBOSE*](#*LOAD-VERBOSE*)
27. [*MACROEXPAND-HOOK*](#*MACROEXPAND-HOOK*)
28. [*MODULES*](#*MODULES*)
29. [*PACKAGE*](#*PACKAGE*)
30. [*PRINT-ARRAY*](#*PRINT-ARRAY*)
31. [*PRINT-BASE*](#*PRINT-BASE*)
32. [*PRINT-CASE*](#*PRINT-CASE*)
33. [*PRINT-CIRCLE*](#*PRINT-CIRCLE*)
34. [*PRINT-ESCAPE*](#*PRINT-ESCAPE*)
35. [*PRINT-GENSYM*](#*PRINT-GENSYM*)...## `YES-OR-NO-P`COMMON-LISP:YES-OR-NO-P[symbol]YES-OR-NO-P names a compiled function:Lambda-list: (&OPTIONAL FORMAT-STRING &REST ARGUMENTS)Declared type: (FUNCTION(&OPTIONAL (OR STRING NULL FUNCTION) &REST T)(VALUES BOOLEAN &OPTIONAL))Derived type: (FUNCTION (&OPTIONAL T &REST T)(VALUES BOOLEAN &OPTIONAL))Documentation:YES-OR-NO-P is similar to Y-OR-N-P, except that it clears theinput buffer, beeps, and uses READ-LINE to get the stringsYES or NO.Source file: SYS:SRC;CODE;QUERY.LISP## `ZEROP`COMMON-LISP:ZEROP[symbol]ZEROP names a compiled function:Lambda-list: (NUMBER)Declared type: (FUNCTION (NUMBER) (VALUES BOOLEAN &OPTIONAL))Derived type: (FUNCTION (T) (VALUES BOOLEAN &OPTIONAL))Documentation:Is this number zero?Known attributes: foldable, flushable, unsafely-flushable, movableSource file: SYS:SRC;CODE;NUMBERS.LISP
这个文件实在太长了,只能每个人都产生了在自己电脑上查看。
好奇先生的部分好奇心暂时得到完全的满足,他有一整套工具对自己的Lisp系统进行探索。真是太棒了!
总结
- 包是Lisp中的一个重要概念,它可以帮助我们组织符号。
- 一个包可以包含很多符号,我们可以通过
do-external-symbols
来遍历一个包中的所有符号。 - 一个符号可以有文档字符串,我们可以通过
describe
来查看一个符号的文档字符串。 - 对于Lisp的学习,应该尽快建立
REPL
工具,然后用Lisp来探索Lisp。
相关文章:
![](https://i-blog.csdnimg.cn/direct/98eb27a8a0db4dbeb472846b6064dce2.jpeg#pic_center)
老古董Lisp实用主义入门教程(5):好奇先生用Lisp探索Lisp
鲁莽先生什么都不管 鲁莽先生打开电脑,安装一堆东西,噼里啪啦敲了一堆代码,叽里呱啦说了一堆话,然后累了就回家睡觉了。 这可把好奇先生的兴趣勾起来,他怎么也睡不着。好奇先生打开电脑,看了看鲁莽先生留…...
![](https://i-blog.csdnimg.cn/direct/45090b16dbff43d0911f9eb1be9c26e0.png)
linux文件——用户缓冲区——概念深度理解、IO模拟实现
前言:本篇文章主要讲解文件缓冲区。 讲解的方式是通过抛出问题, 然后通过分析问题, 将缓冲区的概念与原理一步一步地讲解。同时, 本节内容在最后一部分还会带友友们模拟实现一下c语言的printf, fprintf接口,…...
![](https://www.ngui.cc/images/no-images.jpg)
Selenium模拟鼠标滚动页面:实现自动化测试中的页面交互
Selenium模拟鼠标滚动页面:实现自动化测试中的页面交互 在进行网页自动化测试时,经常需要模拟用户的滚动行为来加载更多内容或触发页面上的某些交互。Selenium WebDriver提供了强大的工具来模拟这些用户行为,包括鼠标滚动。本文将介绍如何使…...
![](https://i-blog.csdnimg.cn/direct/ae37fff95ba5418a921bc5c1fb0ac9a6.png)
Eureka原理与实践:构建高效的微服务架构
Eureka原理与实践:构建高效的微服务架构 Eureka的核心原理Eureka Server:服务注册中心Eureka Client:服务提供者与服务消费者 Eureka的实践应用集成Eureka到Spring Cloud项目中创建Eureka Server创建Eureka Client(服务提供者&…...
![](https://www.ngui.cc/images/no-images.jpg)
OpenJDK 和 OracleJDK 的区别、下载方式
OpenJDK 和 OracleJDK 都是 Java 开发套件 (JDK),用于开发和运行 Java 应用程序。它们之间的主要区别如下: 许可证和使用限制: OpenJDK:由 OpenJDK 社区开发和维护,基于 GPL v2 with Classpath Exception 许可证&#…...
![](https://i-blog.csdnimg.cn/direct/f44a1e02645d41eab16216c6208485c3.png)
arthas源码刨析:arthas-core (2)
文章目录 attach JVMagent**ArthasBootstrap** arthas-core的启动可以从上一篇做参考 参考 pom,即启动是调用的 Arthas 的 main 方法 attach JVM JVM提供了 Java Attach 功能,能够让客户端与目标JVM进行通讯从而获取JVM运行时的数据,甚至可以…...
![](https://img-blog.csdnimg.cn/img_convert/506590b99ea68ee93b1fffeeac0d50cd.jpeg)
【分享】格力手机色界G0245D 刷REC、root、 救砖、第三方rom教程和资源
开门见山 帮别人弄了一台 格力G0245D,把找到的资源和教程分享一下 教程 这个写的很详细了格力手机色界G0245D-Root-最简指南 不过教程里刷rec这一步漏了加上电源键,加上就行了。 附加参考:格力手机2刷机 格力手机二代刷机 GREE G0215D刷机…...
![](https://i-blog.csdnimg.cn/direct/6dcba1e3976c4ef28e4977d8411a85ff.png)
开学必备清单来啦!大学好物合集推荐!每一个都能帮你提升幸福感
随着开学季的到来,好多学生都在忙着准备各类学习与生活必需品,以迎接新的大学生活到来。以下是一些开学季必备的好物推荐,每一个都很实用,可以帮你提升学习和生活的幸福感! 1、西圣电容笔 一句话推荐:公认…...
![](https://www.ngui.cc/images/no-images.jpg)
已解决:javax.xml.transform.TransformerFactoryConfigurationError 异常的正确解决方法,亲测有效!!!
1. 问题描述 javax.xml.transform.TransformerFactoryConfigurationError 是在使用 Java 的 XML 处理库时,配置 TransformerFactory 出错时抛出的异常。通常,这个异常发生在应用程序试图创建一个 TransformerFactory 实例时,由于无法找到合适…...
![](https://i-blog.csdnimg.cn/direct/4c8694a971134acaa506c427212c52b4.png)
商品价格与优惠信息在API返回值中的位置
在API返回值中,商品价格与优惠信息的具体位置可能因不同的电商平台和API设计而有所不同。然而,一般来说,这些信息会以结构化的方式呈现,通常包含在一个包含多个字段的JSON对象或XML文档中。以下是根据多个电商平台(如阿…...
![](https://www.ngui.cc/images/no-images.jpg)
Oracle Index Partition索引分区的管理
Oracle索引分区的管理是数据库管理中的重要任务之一,它涉及索引的创建、维护、重建以及优化等多个方面。以下是对Oracle索引分区管理的详细解析: 一、索引分区的概念 索引分区(Partitioned Index)是针对分区表而言的,…...
![](https://i-blog.csdnimg.cn/direct/a4da2b3d0c5b4d74b25c743378cf1fde.png)
统信UOS系统访问windows共享目录
问题背景 当我们使用UOS系统的时候,想要访问windows系统的一些资料并将其拷贝下来使用的话,应该怎么操作呢?这个需求是可以实现的,统信UOS系统是基于Linux系统开发的,Linux系统和windows系统之间可以通过SMB协议来共享…...
![](https://www.ngui.cc/images/no-images.jpg)
单一职责原则与REST API设计:如何定义清晰的资源与职责
在软件设计中,单一职责原则(Single Responsibility Principle, SRP)和 REST API 设计是两个重要的概念。单一职责原则是一种设计原则,它强调一个类或模块应当只有一个单一的职责,这有助于提高系统的可维护性和扩展性。…...
![](https://i-blog.csdnimg.cn/direct/41ba1c8580304ba596da30b5766bd811.png)
JAVA IO模型
我们在平常开发过程中接触最多的就是 磁盘 IO(读写文件) 和 网络 IO(网络请求和响应)。从应用程序的视角来看的话,我们的应用程序对操作系统的内核发起 IO 调用(系统调用),操作系统负…...
![](https://i-blog.csdnimg.cn/blog_migrate/5309fd059aea4f2ccf0c6d984fd47572.png#pic_center)
《C/C++实战专栏》介绍
🚀 前言 本文是《C/C实战专栏》专栏的说明贴(点击链接,跳转到专栏主页,欢迎订阅,持续更新…)。 专栏介绍:以多年的开发实战为基础,总结并讲解一些的C/C基础与项目实战进阶内容&…...
![](https://www.ngui.cc/images/no-images.jpg)
前端跨域2
前端跨域2 前端跨域解决方案(11种方案) 1.JSONP跨域解决方案的底层原理 script、img、link、iframe...<script src"https://cdn.bootcss.com/jquery/3.4.1/core.js"></script>// 这个就是因为script标签没有跨域限制࿰…...
![](https://i-blog.csdnimg.cn/direct/2b07cfd708ea494096d550890bd6ae1a.png)
electron仿微信,新建贴合窗口
说明 在写electron项目时,只有一个主窗口不足以满足需求,我们通常还会打开很多个窗口。 怎么打开一个子窗口像微信的聊天界面一样,全贴合在一起,看起来像一个整体呢: 分析 这个窗口有点像element ui中的抽屉(drawe…...
![](https://i-blog.csdnimg.cn/direct/e3a28fed31df47989dc69add083d69e8.png)
uniapp微信小程序 分享功能
uniapp https://zh.uniapp.dcloud.io/api/plugins/share.html#onshareappmessage export default {onShareAppMessage(res) {if (res.from button) {// 来自页面内分享按钮console.log(res.target)}return {title: 自定义分享标题,path: /pages/test/test?id123}} }需要再真机…...
![](https://www.ngui.cc/images/no-images.jpg)
Java实现数据库数据到Excel的高效导出
在数据处理和分析工作中,经常需要将数据库中的数据导出到Excel文件中。本文将提供一个Java实现的示例,展示如何边从数据库读取数据,边将其写入Excel文件,同时注重内存效率。 环境配置: Java 1.8 或更高版本MySQL 5.7…...
![](https://i-blog.csdnimg.cn/direct/aa1b45c874a040e29530a5bf4b2c2d99.png)
python之matplotlib (8 极坐标)-圆与心
极坐标 极坐标图像的绘制类似于三维图像的绘制,只需要将projection参数由3d改为polar即可。 import numpy as np import matplotlib.pyplot as plt figplt.figure() axfig.add_subplot(projectionpolar)theta np.linspace(0, 2 * np.pi, 100) r np.sin(the…...
![](https://www.ngui.cc/images/no-images.jpg)
Kubernetes Pod调度基础
在传统架构中,我们总在考虑或者面临一个问题,我们的应用需要部署在哪里,我们的应用下载在哪里运行着?有一个服务不可访问了,去哪里排査?诸如此类的问题总是会出现在工作中。 但是在使用 Kubernetes 部署应用后ÿ…...
![](https://img-blog.csdnimg.cn/img_convert/b90757530617a88cc618733bcca11b94.jpeg)
80页WORD方案深入了解大数据治理+大数据资产管理+数据运营
文档是一份80页可编辑的企业大数据智能管理与治理平台建设项目技术方案标书文档,涵盖了从项目需求分析、技术方案、建设方案、服务方案到类似案例介绍等多个方面的内容。 1. 项目需求分析 项目建设目标:旨在实现数据的可视化,确保决策者、行…...
![](https://i-blog.csdnimg.cn/direct/41b423c906e04e7e8765d2dc30ac403c.png)
OCC安装、VS2019编译运行(新手教程)
OCC安装、VS2019编译运行(新手教程) 简介1、OpenCasCade的下载和安装官网下载安装2、OpenCasCade的运行和编译(VS2019)修改配置文件环境变量配置3、验证代码项目配置运行cpp文件简介 作为一个刚接触OCC的程序员,可能会不知所措,无从下手,甚至在OCC的安装使用都困难重重…...
![](https://www.ngui.cc/images/no-images.jpg)
Mojo 实现排序功能
sort排序 实现排序功能。 您可以从包中导入这些 API。例如:algorithm from algorithm.sort import sortpartition partition[type: AnyRegType, cmp_fn: fn[AnyRegType]($0, $0, /) capturing -> Bool](buff: Pointer[*"type", 0], k: Int, size: …...
![](https://www.ngui.cc/images/no-images.jpg)
信息学奥赛一本通编程启蒙题解(3031~3035)
前言 Hello大家好我是文宇 正文 3031 #include<bits/stdc.h> using namespace std; double n,m,x; int main(){cin>>n>>m;xn-m*0.8;cout<<fixed<<setprecision(2)<<x;return 0; } 3032 #include<bits/stdc.h> using namespace…...
![](https://i-blog.csdnimg.cn/direct/967ea2233de64dcca33ab156aad4c770.png)
字符函数内存函数———C语言
字符分类函数 头文件: ctype.h 函数功能iscntrl判断字符是否为控制字符isspace判断字符是否为空白字符(空格,换页、换行、回车、制表符或垂直制表符)isdigit判断字符是否为十进制数字isxdigit判断字符是否为十六进制数字(0-9)(a…...
![](https://www.ngui.cc/images/no-images.jpg)
c语言跨文件传输数据
在 C 语言中,可以通过以下几种方式获取其他 C 文件中定义的变量: 一、使用 extern 关键字 在需要获取变量的文件中,使用extern关键字声明该变量。 例如,如果在other.c文件中有一个全局变量int globalVar;,在当前文件中…...
![](https://i-blog.csdnimg.cn/direct/2024603686864f9fb45c15890e75a993.jpeg)
企业文件防泄密怎么做?10款透明加密软件排行榜
在信息时代,企业的核心竞争力往往体现在其拥有的知识和信息上,而企业文件的安全性直接关系到这些信息的保护。文件防泄密已成为企业管理中的重要议题,透明加密技术因其无缝集成和高效保护的特性,成为企业防泄密的首选方案。2024年…...
![](https://i-blog.csdnimg.cn/direct/665bf1d85bc440d6b4f852ce7a6089a2.png)
AI编程工具的力量:以AWS Toolkit与百度Comate为例,加速程序员开发效率
在当今的数字化转型浪潮中,人工智能(AI)技术不仅重塑了众多行业,也为软件开发领域带来了革命性的变化。AI编程工具,凭借其智能化的特性,正在成为程序员提高开发效率、优化代码质量和加速产品迭代的重要助力…...
![](https://i-blog.csdnimg.cn/direct/f8c6adb786a94bb78456565512a63806.png#pic_center)
smallpdf: 免费高效的PDF水印添加工具
引言 在数字文档管理和分享的过程中,保护版权和确保文档的原创性变得尤为重要。PDF文件作为一种广泛使用的格式,经常需要添加水印来表明所有权或提醒查看者注意文档的敏感性。本文将介绍一款名为smallpdf的免费工具,它能够轻松地为PDF文件添…...
![](/images/no-images.jpg)
南宁网站建设服务商/制作网页的基本步骤
最近开始动手做实验,之前写了一个小实验利用到了PCL库中的索引; 现在在写利用PCL中的RegionGrowing类来分割生成面片,无论是迭代生成还是进行提取都需要用到pcl库中定义的索引, 虽然搞的不是太明白,还是想写下来来记录…...
![](/images/no-images.jpg)
男女做爰免费网站/浙江百度代理公司
理解什么是面向过程,面向对象. 面向过程与面向对象都是我们编程中,编写程序的一种思维方式。 面向过程的程序设计方式,是遇到一件事时,思考“我该怎么做”,然后一步步实现的过程。 例如:公司打扫卫生(擦玻璃…...
![](https://img-blog.csdnimg.cn/20200913113854328.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MDExOTQxMg==,size_16,color_FFFFFF,t_70#pic_center)
asp企业网站模板/常见的网络营销方式有哪几种
浏览器地址栏输入URL到显示页面发生了什么? 1.用户输入 2.卸载原页面并重定向到新页面 3.处理Service Worker 4.网络请求 5.服务端响应 6.浏览器渲染详细流程 这个过程分为两个部分:网络通信页面渲染 步骤1:DNS 域名解析(域名解析…...
![](/images/no-images.jpg)
建设职业注册中心网站/网络推广方案怎么写
70 爬楼梯 给定 n 节台阶,每次可以走一步或走两步,求一共有多少种方式可以走完这些台阶。 输入是一个数字,表示台阶数量;输出是爬台阶的总方式。 输入: 2 输出: 2 解释: 有两种方法可以爬到楼…...
![](https://www.oschina.net/img/hot3.png)
公司管理系统软件/安徽seo推广
为什么80%的码农都做不了架构师?>>> 作者:汪娇娇 时间:2017年7月7日 一、铺垫 依靠七牛上传图片,其实有很多方法,先说说有哪些方法,以及这些方法各自的优缺点吧。 way1:前端只负责选…...
![](http://s3.51cto.com/wyfs02/M01/47/0A/wKioL1P1vGDAPn7YAAMtnmI0M8I803.jpg)
临沂企业建站效果好/小程序拉新推广平台
应用环境: 操作系统: RedHat EL55 Oracle: Oracle 10gR2 Oracle DB_FILE_MULTIBLOCK_READ_COUNT是Oracle比较重要的一个全局性参数,可以影响系统级别及sessioin级别。主要是用于设置最小化表扫描时Oracle一次按顺序能够读取的数…...