Make Lisp Great Again--利用隐藏函数恢复isp的活力!
首先致谢:baitang36、tryhi、菜卷鱼等诸多大神!自从隐藏的lisp被本论坛的一些大神发现后,LISP又重新恢复了活力。
套用川建国同志的一句话,隐藏函数 “Make Lisp Great Again”!
一、下面链接是关于隐藏函数的一些介绍和如何挖掘出来并加以应用:
本帖所提到的函数,不能直接在autolisp中使用,如何使用,请参考上面链接。
二、autolisp来源于common lisp,其中有很多隐藏函数也是common lisp的函数,这里着重介绍几个有用的:
1、Format函数
format函数是一个相当有用的函数,在许多编程语言均为格式化输出,譬如C语言的printf。
在autolisp中,如果要打印这样的格式化输出,你得用到多个princ函数,或者用strcat连接起来,并还得用一些数值转字符串的函数,这很不方便。
有了format函数,就会显得很简单了。当然你也可利用format函数格式化字符串。
下面一些链接为format函数的介绍。
下面摘抄一段关于format的说明:
>(format t "~%The clever dog can do ~A + ~A =~A ." 2 3 5)
The clever dog can do 2 + 3 =5 .
NIL
Fortmat 的第一个参数是输出地,此例的参数 t 表示输出到 toplevel;第二个参数是输出格式串,~%
表示
, ~A 表示该位置将用对应的参数进行替换。 Common Lisp 的打印格式串有多种控制符,如:
~A,~S,~P是用于对象控制的。例如,
>(format t "~%TildeS prints ~S~%TildeA prints ~A " 'ACL::asymbol 'ACL::asymbol )
TildeS prints ACL::ASYMBOL
TildeA prints ASYMBOL
NIL
此例应注意~A 与~S 差别。~S 可以打印出控制符,而~A 不能。~P 打印复数后缀”s”。
~D ~B ~O ~X ~R 为整数控制符,它们分别打印十进制、二进制、八进制、十六进制、基数。
>(format nil " ~D ~B ~O ~X" 12 12 12 12)
" 12 1100 14 C twelve"
~E ~F ~G ~$为浮点数控制符,分别按照指数格式、定点式、浮点式、浮点定点结合方式。例,
>(format nil " ~E ~F ~G ~$" 123450 123450 123450 123450)
" 1.2345E5 123450.0 123450. 123450.00"
> (format nil " ~E ~F ~G ~$" 123.450 123.450 123.450 12.3450)
" 1.2345E2 123.45 123.45 12.35"
~n%,~n&,~|为空白控制符,分别表示 n
,n-1 行,新一页。
> (format nil "begin ~2% and ~2&end")
"begin
and
end "
值得注意的是,在上述例子中,format 的第一个参数为 nil 时,打印执行后返回值不出现 nil;而参数
为 t 时,打印执行后返回值出现 nil> (SETF A (READ))这就是所谓 Lisp 的副产品。
小惊喜:这个函数还可以直接进行数制之间的转化,不需要其他函数了,请看上面说明的第三条。
2、利用put和get函数为lisp添加一点面向对象编程。
值得注意的是lisp是一个函数式编程语言,并不是一个面向对象编程的语言,然而你还是可以利用某些函数添加面向对象的性质。
譬如赋予符号某些属性,下面有一些函数是可以用来存取符号的属性的。
get symbol property
This function returns the value of the property named property in symbol’s property list. If there is no such property, it returns nil. Thus, there is no distinction between a value of nil and the absence of the property.The name property is compared with the existing property names using eq, so any
object is a legitimate property.
See put for an example.
put symbol property value
This function puts value onto symbol’s property list under the property name property, replacing any previous property value. The put function returns value.
(put 'fly 'verb 'transitive)
)'transitive
(put 'fly 'noun '(a buzzing little bug))
) (a buzzing little bug)
(get 'fly 'verb)
) transitive
(symbol-plist 'fly)
) (verb transitive noun (a buzzing little bug))
symbol-plist symbol
This function returns the property list of symbol.
setplist函数不能用,我就不抄录了。
上面的用法,请读者自行练习和体会。
3、利用vector函数为lisp添加新的数据类型。
这个我不用介绍了,发现。链接:
4、其它可以用的一些common lisp函数:
nconc
adjoin
member-if-->相当于vl-member-if
member-if-not-->相当于vl-member-if-not
NREVERSE
concat
rassoc
等等,太多,不再一一列举。
这个是手册,大家可以从中去寻找对你也许可能有用的函数。
如果大家找到了一些有用的,不妨分享给大家。
**** Hidden Message *****
我贡献最小,跟真大神相提并论有点惭愧
adjoin;;;(adjoin item list) == (if (member item list) list (cons item list))
acons;;; (acons x y a) == (cons (cons x y) a)
butlast;;;去掉列表的最后一个元素 (reverse (cdr (reverse lst)))
code-char / char-code;;;相当于(rem int 256),跟ASCII相关,不知道有啥用
format ;;; 格式化
funcall;;; (funcall '+ 1 2 3)跟apply相比,不需要接一个表
reduce ;;; (reduce '+ '(1 2 3) 4) 跟apply相比,后面可以多接一个原子
every ;;; 等于vl-every
ldiff;;; 不知道具体啥用途
make-list;;; (make-list 5) (nil nil nil nil nil)
nconc;;;(nconc x y) = (setq x (append x y)) 扩展 x
nreconc ;;; (nreconc '(1 2 3 4 5) '(6 7))=== (5 4 3 2 1 6 7)
nthcdr;;; 去掉前N个元素
revappend ;;; (append (reverse x) y)
typep ;;; (type 1 参数类型)类型可以通过 type-of获取 ,相当于 (= (type a) 参数类型)
type-of;;; 获取参数类型
rassoc;;; (rassoc 'a '((a . b) (b . c) (c . a) (z . a))) => (c . a)
string-upcase ;;;大写 跟strcase 差不多
string-downcase;;;小写
string-capitalize;;; 英文单词,可以是英文句子的单词,首字母大写
string-equal;;;忽略大小写对比字符串
string-lessp;;;检查操作数的值是否单调递减。
rplaca;;(cons x (cdr lst))
rplacd;;(cons (car x) lst)
read-from-string;;;(read-from-string "abcde")==> ("abcde" . 5) 5是字符串长度
nreverse;;;; 应该跟 reverse 差不多 ,没仔细研究
defmacro ;;;;能激活,不会用
defvar ;;;;能激活,不会用
defun;;;;能激活,不会用
let ;;;;能激活,不会用
可以从附件里试
(format t "~%The clever dog can do ~A + ~A =~A ." 2 35) 35中间少个空格
(format nil " ~D ~B ~O ~X ~R" 12 12 12 12 12)原因:unknown format directive: "r" 位置-> 行:1 列:2(~R 用不了,不知道为什么)
我常常地想,autolisp设计者是哲学大师。比如C的while,有几种写法,而autolisp中while只有一种,便于掌握。C的while写法太多,使人花了更多时间去理解,而实际用处跟autolisp的一种写法是一样的;defun自定义的函数参数是固定的,也便于定义和掌握。
列出的都是隐藏函数吗? 感谢版主共享资料! 各位大师多来点通俗易懂的
实例科普一下
让我等小菜也能沾沾光 很好玩的东西 高山仰止 感谢各位走在前沿的大神前辈,探索了更多的可能,拓宽了前进的道路。
无私的分享和奉献
页:
[1]