乐筑天下

搜索
欢迎各位开发者和用户入驻本平台 尊重版权,从我做起,拒绝盗版,拒绝倒卖 签到、发布资源、邀请好友注册,可以获得银币 请注意保管好自己的密码,避免账户资金被盗
查看: 166|回复: 9

Make Lisp Great Again--利用隐藏函数恢复isp的活力!

[复制链接]

56

主题

346

帖子

68

银币

中流砥柱

Rank: 25

铜币
512
发表于 2022-7-26 11:26:00 | 显示全部楼层 |阅读模式
首先致谢: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的说明:
>
  1. (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  是用于对象控制的。例如,
>
  1. (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 为整数控制符,它们分别打印十进制、二进制、八进制、十六进制、基数。
>
  1. (format nil " ~D ~B ~O ~X" 12 12 12 12)

" 12 1100 14 C twelve"
~E ~F ~G ~$为浮点数控制符,分别按照指数格式、定点式、浮点式、浮点定点结合方式。例,
>
  1. (format nil " ~E ~F   ~G ~$" 123450 123450 123450 123450)

" 1.2345E5 123450.0   123450.      123450.00"
>  
  1. (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 行,新一页。
>  
  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 [Function]
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 [Function]
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 [Function]
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
等等,太多,不再一一列举。
这个是手册,大家可以从中去寻找对你也许可能有用的函数。
如果大家找到了一些有用的,不妨分享给大家。

本帖以下内容被隐藏保护;需要你回复后,才能看到!

游客,如果您要查看本帖隐藏内容请回复
回复

使用道具 举报

38

主题

333

帖子

13

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
480
发表于 2022-7-26 14:53:00 | 显示全部楼层

我贡献最小,跟真大神相提并论有点惭愧
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    ;;;;能激活,不会用
可以从附件里试
回复

使用道具 举报

14

主题

265

帖子

67

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
318
发表于 2022-7-26 15:02:00 | 显示全部楼层
(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 用不了,不知道为什么)
回复

使用道具 举报

188

主题

1652

帖子

31

银币

顶梁支柱

Rank: 50Rank: 50

铜币
2391
发表于 2022-7-27 09:02:00 | 显示全部楼层

我常常地想,autolisp设计者是哲学大师。比如C的while,有几种写法,而autolisp中while只有一种,便于掌握。C的while写法太多,使人花了更多时间去理解,而实际用处跟autolisp的一种写法是一样的;defun自定义的函数参数是固定的,也便于定义和掌握。
回复

使用道具 举报

18

主题

158

帖子

12

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
225
发表于 2022-7-26 11:51:00 | 显示全部楼层
列出的都是隐藏函数吗?
回复

使用道具 举报

15

主题

227

帖子

20

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
276
发表于 2022-7-26 12:28:00 | 显示全部楼层
感谢版主共享资料!
回复

使用道具 举报

41

主题

320

帖子

12

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
483
发表于 2022-7-26 12:45:00 | 显示全部楼层
各位大师多来点通俗易懂的
实例科普一下
让我等小菜也能沾沾光
回复

使用道具 举报

27

主题

85

帖子

7

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
192
发表于 2022-7-26 15:41:00 | 显示全部楼层
很好玩的东西
回复

使用道具 举报

2

主题

185

帖子

15

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
188
发表于 2022-7-27 10:20:00 | 显示全部楼层
高山仰止
回复

使用道具 举报

0

主题

12

帖子

5

银币

初来乍到

Rank: 1

铜币
12
发表于 2022-7-27 10:55:00 | 显示全部楼层
感谢各位走在前沿的大神前辈,探索了更多的可能,拓宽了前进的道路。
无私的分享和奉献
回复

使用道具 举报

发表回复

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

QQ|关于我们|小黑屋|乐筑天下 繁体中文

GMT+8, 2025-3-4 01:57 , Processed in 0.864214 second(s), 72 queries .

© 2020-2025 乐筑天下

联系客服 关注微信 帮助中心 下载APP 返回顶部 返回列表