明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
楼主: aroom

TeaScript 编程(二次开发AutoCAD、Lisp写windows应用程序)

    [复制链接]
发表于 2012-5-28 23:25:42 | 显示全部楼层
这个不错,关注一下
发表于 2012-5-29 08:34:53 | 显示全部楼层
本帖最后由 xiaxiang 于 2012-5-29 08:35 编辑
更多详细介绍,请参阅近期出版的《算子》(Programming In TeaScript)一书。

这本书有介绍吗,或者预览版,放出来看看可以吗?什么时候出版?
 楼主| 发表于 2012-5-29 09:52:44 | 显示全部楼层
xiaxiang 发表于 2012-5-29 08:34
这本书有介绍吗,或者预览版,放出来看看可以吗?什么时候出版?

本书内容分为四部分:编程基础、交互教程、应用示例与内建函数详解。
编程基础从编程书写规则与系统内部的求值规则入手,全面了解 TeaScript 函数式编程语言的特点,从符号处理切入使用面向对象的来解决问题。
交互教程使用控制台窗口REPL逐行解释代码的求值过程,方便你对照练习,加深了解。
应用示例呈现一个开源的Win32 应用程序源代码,通过代码注释让你来了解图形界面的集成开发环境IDE 的设计。
内建函数详解全面介绍API 函数的功能、参数和返回值说明。配以各种语法的范例代码,让你轻松掌握内建函数以及使用方法,具有很好的参考价值。

预计7月出版
发表于 2012-5-29 13:23:19 | 显示全部楼层
有兴趣,收藏了。谢谢楼主!
发表于 2012-5-29 14:28:56 | 显示全部楼层
可以学学,谢谢共享资料。
发表于 2012-5-30 08:30:44 | 显示全部楼层
希望楼主能上传,关注
 楼主| 发表于 2012-5-30 09:47:13 | 显示全部楼层
longer1000 发表于 2012-5-30 08:30
希望楼主能上传,关注

附件在24楼
 楼主| 发表于 2012-5-30 11:45:19 | 显示全部楼层
TeaScript 定义多态函数


首先,我们来分析Autolisp的函数:

(defun f (x) (+ x 1))  ;定义一个简单的用户函数

> (f 1)   => 2   ;调用f函数,将1代入自变量x, 求值结果返回 2

> (f)   ;调用f函数,自变量x没有赋值,你发现了什么?

> (f 1 2)   ;调用f函数,多了一个自变量y,但y没有在函数中定义,你又会得到什么结果?

对,后面两行调用f函数会出错,(f) 参数太少; (f 1 2) 参数太多

再来测试,AutoLisp的 + 内建函数:

> (+)   => 0

> (+ 1)   => 1

> (+ 1 2)   => 3

> (+ 1 2 3)   => 6

你会发现,上面调用 + 函数不会出错,参数可以是0,1,2,3...n (无数个) 。参数既没有太少也没有太多的问题

AutoLisp内建函数可以带可变数量的多态函数,但用户自定义的函数不可以。


TeaScript内建函数以及用户自定义的函数都可以带可变数量的多态函数。

TeaScript中,函数的参数都是可选的:代入的实际参数个数比形式参数个数少的时候, 未
绑定的形参变量设为 nil ;代入的实际参数个数比形式参数个数多的时候, 多余的实际参数放入由
& 开头的形参变量中。

(defun myFunc (a b &c)
    (println a " , " b " , " c))

(myFunc) → nil , nil , ()
(myFunc 1) → 1 , nil , ()
(myFunc 1 2) → 1 , 2 , ()
(myFunc 1 2 3) → 1 , 2 , (3)
(myFunc 1 2 3 4) → 1 , 2 , (3 4)

如果形式参数列表中未发现由 & 开头的形参变量时,多余的实际参数放入到 args 变量中。 在函数
体内,可以通过 arguments 变量来访问所有代入的参数。


(defun myFunc ()
(apply + args))

(myFunc)  → 0
(myFunc 1) → 1
(myFunc 1 2) → 3
(myFunc 1 2 3 ) → 6
(myFunc 1 2 3 4) → 10

形式参数的缺省值,通过括号来将参数与缺省值关联起来

(defun myFunc ((a 5) (b 10))
(+ a b))
(myFunc) → 15
(myFunc 1) → 11
(myFunc 1 2) → 3
(myFunc 1 2 3) → 3

函数体内部使用的局部变量可以放到形式参数列表中,用逗号或斜杠将它们与形式参数隔开。 这些局
部变量在函数调用时,初始化为 nil 。

(defun myFunc (a b &c / x y z)
   (setq x …)
   (…))

;; 等同于
(defun myFunc (a b &c)
    (let ((x nil)(y nil)(z nil))
          (setq x …)
          (…)))


当调用该函数时,只有 a,b 用作定位的形式参数,c 作为第三个及以后的实际参数的容器。 而
(x,y 和 z) 是函数体内用到的局部变量,它们初始化为 nil 。 当函数执行完成后,这些参数表中
的变量名随作用域一起被销毁。

 楼主| 发表于 2012-5-30 13:29:41 | 显示全部楼层
本帖最后由 aroom 于 2012-5-30 13:32 编辑

TeaScript 中使用正则表达式

regex
语法: (regex str_pattern str_text [int_option [int_offset]])
执行一个 Perl 兼容的正则表达式 (PCRE) 查找。 str_text 给定待查找的字符串,由字符串
str_pattern 指定查找的样式。 directory, find,findAll, parse,replace, 和 search 函数
也同样支持正则表达式样式匹配。
regex 函数返回一个由已匹配的字符串、子字符串、偏移位置 和每个字符串的长度组成的列表。 如
果未能匹配,返回 nil。 偏移数值可以用于后续的处理。
此外,指定可选参数 int_option 可以用来控制正则表达式选项,后面会讲到。 附加参数
int_offset 告诉 regex 函数从指定的偏移位置开始查找, 而不是从字符串的开始处来查找。
regex 返回结果中的偏移位置和字符串长度是基于单个字节计算的。 即使 TeaScript 引擎是 UTF-8
版本编译的也是这样。
regex 同时也将系统变量 $0,$1, 和 $2— 设置为找到的表达式和子表达式。 正如 TeaScript 中
其他的符号那样, 这些变量或它们的等同表达式 ($ 0),($ 1), 和 ($ 2)— 可用在其他的
TeaScript 表达式中来进一步处理。
使用正则表达式查找的函数当未能匹配时并不会重置,不会将 $0,$1 ... $15 这些变量设为 nil。
(regex "b+" "aaaabbbaaaa") → ("bbb" 4 3)
; 不区分大小写查找选项为 1
(regex "b+" "AAAABBBAAAA" 1) → ("BBB" 4 3)
(regex "[bB]+" "AAAABbBAAAA" ) → ("BbB" 4 3)



正则表达式样式中的特殊字符


\:用作转义符。
\符号后面如果跟的是普通字符c,那么\c就代表特殊的含义,例如n本来代表字符n,但\n就代表
换行。
\符号后面如果跟的是特殊字符c,那么\c就代表普通字符c,例如\一般用作转义符,但\\则调表
普通字符\。
.:小数点中的"."号,匹配任何一个单独的字符,但是换行符除外。
(regex /a.b/ "acbaa") → ("acb" 0 3)
(regex /a.b/ "abbb") → nil
匹配"acbaa"中的"acb",但是不匹配"abbb"。
x|y:匹配x或y。注意如果x和y都匹配上了,那么只记住x。
(regex /beijing|shanghai/ "I love beijing and shanghai") → ("beijing" 7 7)
(regex /beijing|shanghai/ "I love beijing and shanghai" 0 14) → ("shanghai" 19 8)
结果匹配成功,当然shanghai也匹配。
[xyz]:xyz表示一个字符串,该样式表示匹配[]中的一个字符,形式上[xyz]等同于[x-z]。
(regex /a[bc]d/ "abddgg") → ("abd" 0 3)
结果匹配成功。
(regex /a[bc]d/ "abcd") → nil
结果匹配失败,因为[bc]表示匹配b或c中的一个,但不会同时匹配。
[^xyz]:该样式表示匹配非[]中的一个字符,形式上[^xyz]等同于[^x-z]。
(regex /a[^bc]d/ "afddgg") → ("afd" 0 3)
结果匹配成功。
(regex /a[^bc]d/ "abd") → nil
结果匹配失败。
[\b]:匹配退格键。
\b:匹配一个词的边界符,例如空格和换行符等等,当然匹配换行符时,表达式应该附加参数
m。
(regex /\bc./ "Beijing is a beautiful city") → ("ci" 23 2)
结果匹配成功,注意c前边的空格不会匹配到结果中。
\B:代表一个非单词边界。
(regex /\Bi./ "Beijing is a beautiful city") → ("ij" 2 2)
结果匹配成功。
\cX,匹配一个控制字符。
例如,\cM 匹配一个 Control-M 或 回车符。 x 的值必须为 A-Z 或 a-z 之一。否则,将 c 视
为一 个原义的 ’c’ 字符。(实际的例子还需补充)
\d:匹配一个数字字符,等同于[0-9]。
(regex /user\d/ "user1") → ("user1" 0 5)
结果匹配成功。
\D:匹配一个非数字字符,等同于[^0-9]。
(regex /user\D/ "userA") → ("userA" 0 5)
结果匹配成功。
\f:匹配一个换页符。
\n:匹配一个换行符。因为是换行符,所以在表达式中要加入m参数。
(regex /a\nbc/ "a\nbc") → ("a\nbc" 0 4)
结果匹配成功。
\r:匹配一个回车符
\s:匹配一个空格符,等同于[ \f\n\r\t\v\u00A0\u2028\u2029]。
(regex /\si/ "Beijing is a city") → (" i" 7 2)
结果匹配成功。
\S:匹配一个非空格符,等同于[ ^\f\n\r\t\v\u00A0\u2028\u2029]。
(regex /\Si/ "Beijing is a city") → ("ei" 1 2)
结果匹配成功。
\t:匹配一个tab
(regex /a\tb/ "a bc") → ("a\tb" 0 3)
结果匹配成功。
\v:匹配一个竖向的tab
\w:匹配一个数字、_或字母表字符,即[A-Za-z0-9_ ]。
(regex /\w/ "$25.23") → ("2" 1 1)
结果匹配成功。
\W:匹配一个非数字、_或字母表字符,即[^A-Za-z0-9_ ]。
(regex /\W/ "$25.23") → ("$" 0 1)
结果匹配成功。
\n:注意不是\n,这里n是一个正整数,表示匹配第n个()中的字符。
(regex /user([,-])group\1role/ "user-group-role") → ("user-group-role" 0 15 "-" 4 1)
(regex /user([,-])group\1role/ "user,group,role") → ("user,group,role" 0 15 "," 4 1)
(regex /user([,-])group\1role/ "user-group,role") → nil
结果匹配成功,同样对user,group,role的匹配也是成功的,但像user-group,role等会失
败。
\0:匹配一个NULL字符。
\xhh:匹配一个由两位16进制数字所表达的字符。
\uhhhh:匹配一个由四位16进制数字所表达的字符。
^:匹配输入字符串的起始端,如果是多行匹配,即表达式的附加参数中含有m,则也在一个换行
符后匹配。
(regex /^B/ "Bab Bc ") → ("B" 0 1)
匹配字符串中的第一个B
(regex /^B/m "Badd B \ncdaf \nB dsfB") → ("B" 0 1)
匹配字符串中的第一行第一个B
(regex /^B/m "Badd B \ncdaf \nB dsfB" 0 1) → ("B" 14 1)
匹配字符串中的第三行中的第一个B
$:匹配输入字符创的尾端,如果是多行匹配,即表达式的附加参数中含有m,则也在一个换行符
前匹配。 与^的用法相反。
(regex /t$/ "bat") → ("t" 2 1)
(regex /t$/ "hate") → nil
匹配"bat"中的t,但是不匹配"hate"中的t
(regex /t$/m "tag at\nbat") → ("t" 5 1)
匹配字符串中的第一行最后一个t
(regex /t$/m "tag at\nbat" 0 6) → ("t" 9 1)
匹配字符串中的第二行的t
*:匹配前一个字符0次或多次。
(regex /ab*/ "dddabbbbc") → ("abbbb" 3 5)
(regex /ab*/ "ddda") → ("a" 3 1)
匹配"dddabbbbc"中的"abbbb",也匹配"ddda"中的"a"
+:匹配前一个字符1次或多次。
(regex /ab+/ "dddabbbbc") → ("abbbb" 3 5)
(regex /ab+/ "ddda") → nil
匹配"dddabbbbc"中的"abbbb",但不匹配"ddda" 与后面的{1,}(原型:{n,})的用法类似
?:?的用法比较特殊,一般来说它用来对前一个字符做0次或1次匹配,但是它有另外两种特殊的
用法:
(regex /ba*/ "bbbaaaa") → ("baaaa" 0 5)
(regex /ba*?/ "bbbaaaa") → ("b" 0 1)
如果紧跟在*、+、?和{ }之后,则表示原始匹配的最小次数匹配,例如: /ba*/本来匹
配"bbbaaaa"中的"baaaa",但是/ba*?/则匹配"bbbaaaa"中的"b"(因为*表示0次或多次匹配,而
加?应该表示最少次数匹配,即0次匹配)。
(regex /ba+?/ "baaaa") → ("ba" 0 2)
同理:/ba+?/则匹配"baaaa"中的"ba"。 作为语法结构符号,使用于前置断言中,即后面要说到
的x(?=y)和x(?!=y)
{n}:匹配前一个字符的n次出现。 n必须是一个非负数,当然如果是一个负数或小数也不会报语
法错误。
(regex /ab{2}c/ "abbcd") → ("abbc" 0 4)
结果匹配成功。
{n,m}:匹配前一个字符的至少n次最多m次的出现。只要n与m为数字,而且m>=n就不会报语法错
误。
(regex /ab{2,5}c/ "abbbcd") → ("abbbc" 0 5)
(regex /ab{2,2}c/ "abbcd") → ("abbc" 0 4)
(regex /ab{2,5}/ "abbbbbbbbbb") → ("abbbbb" 0 6)
这说明,如果前一个字符出现多于m次,则只匹配m次。
(regex /ab{2,5}c/ "abbbbbbbbbbc") → nil
结果匹配失败,因为b多于5个则b{2,5}会匹配前5个b,而表达式/ab{2,5}c/中b后面是c,但字符
串中5个b之后还是b所以会失败。
{n,}:匹配前一个字符的至少n次出现。
(regex /ab{2,}c/ "abbcdabbbc") → ("abbc" 0 4)
(regex /ab{2,}c/ "abbcdabbbc" 0 4) → ("abbbc" 5 5)
结果匹配成功。
(x):表示匹配x(并非特指字符x或者特指一个字符,x表示一个字符串),而且匹配会被记住,在
语法中这种()被称为"capturing parentheses ", 即捕捉用的小括号。 匹配会被记住,该列表
中保存所匹配的所有字符串。 另外还要注意()中的x被记住的前提是匹配x。
(regex /a(b)c/ "abcddd") → ("abc" 0 3 "b" 1 1)
从上面可以看出,/a(b)c/匹配"abcddd"中的"abc",因为()的原因,b也会记录下来。
(regex /a(b)c/ "acbcddd") → nil
返回nil,因为/a(b)c/不匹配"acbcddd",所以()中的b不会被记录下来(尽管字符串中含有b)
(?:x):匹配x,但不会记住x,这种格式中的()被称为"non-capturing parentheses ",即非捕
捉用的小括号。
(regex /a(?:b)c/ "abcddd") → ("abc" 0 3)
从上面可以看出,/a(?:b)c/匹配"abcddd"中的"abc",因为(?:)的原因,b不会记录下来。
x(?=y):匹配x,仅当后面紧跟着y时。如果符合匹配,则只有x会被记住,y不会被记住。
(regex /user(?=name)/ "The username is Mary") → ("user" 4 4)
结果匹配成功。
x(?!y):匹配x,仅当后面不紧跟着y时。如果符合匹配,则只有x会被记住,y不会被记住。
(regex /user(?!name)/ "The user name is Mary") → ("user" 4 4)
结果匹配成功。
(regex /\d+(?!\.)/ "54.235") → ("5" 0 1)
(regex /\d+(?!\.)/ "54.235" 0 1) → ("235" 3 3)
结果匹配成果,不匹配54是因为54后面跟着"."号,当然235也匹配。
发表于 2012-5-30 14:25:46 | 显示全部楼层
支持aroom重出江湖
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-11-18 06:29 , Processed in 0.134297 second(s), 17 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表