跳转至内容

newLISP 简介 / 互联网

来自 Wikibooks,开放世界中的开放书籍

互联网

[编辑 | 编辑源代码]

HTTP 和网络

[编辑 | 编辑源代码]

大多数网络任务都可以使用 newLISP 的网络功能完成

  • base64-dec 将字符串从 BASE64 格式解码
  • base64-enc 将字符串编码为 BASE64 格式
  • delete-url 删除 URL
  • get-url 从网络读取文件或页面
  • net-accept 接受新的传入连接
  • net-close 关闭套接字连接
  • net-connect 连接到远程主机
  • net-error 返回最后一次错误
  • net-eval 在多个远程 newLISP 服务器上评估表达式
  • net-interface 定义默认网络接口
  • net-listen 监听对本地套接字的连接
  • net-local 连接的本地 IP 和端口号
  • net-lookup IP 编号的名称
  • net-peek 准备好读取的字符数
  • net-peer net-connect 的远程 IP 和端口
  • net-ping 向一个或多个地址发送 ping 包(ICMP 回声请求)
  • net-receive 在套接字连接上读取数据
  • net-receive-from 在打开的连接上读取 UDP 数据报
  • net-receive-udp 在打开的连接上读取 UDP 数据报并关闭连接
  • net-select 检查套接字或套接字列表的状态
  • net-send 在套接字连接上发送数据
  • net-send-to 在打开的连接上发送 UDP 数据报
  • net-send-udp 发送 UDP 数据报并关闭连接
  • net-service 将服务名称转换为端口号
  • net-sessions 返回当前打开的连接列表
  • post-url 将信息发布到 URL 地址
  • put-url 将页面上传到 URL 地址。
  • xml-error 返回最后一次 XML 解析错误
  • xml-parse 解析 XML 文档
  • xml-type-tags 显示或修改 XML 类型标签

使用这些网络功能,您可以构建各种网络应用程序。使用诸如 net-eval 之类的功能,您可以将 newLISP 作为守护进程启动在远程计算机上,然后在本地计算机上使用它将 newLISP 代码发送到网络进行评估。

访问网页

[编辑 | 编辑源代码]

这是一个使用 get-url 的非常简单的示例。给定网页的 URL,获取源代码,然后使用 replace 及其列表构建功能来生成该页面上所有 JPEG 图像的列表

(set 'the-source (get-url "http://www.apple.com"))
(replace {src="(http\S*?jpg)"} the-source (push $1 images-list -1) 0)
(println images-list)
("http://images.apple.com/home/2006/images/ipodhifititle20060228.jpg"
"http://images.apple.com/home/2006/images/ipodhifitag20060228.jpg"
"http://images.apple.com/home/2006/images/macminiwings20060228.jpg" 
"http://images.apple.com/home/2006/images/macminicallouts20060228.jpg" 
"http://images.apple.com/home/2006/images/ipodhifititle20060228.jpg" 
"http://images.apple.com/home/2006/images/ipodhifitag20060228.jpg")

一个简单的 HTML 表单

[编辑 | 编辑源代码]

最简单的搜索表单可能类似于以下内容。

(load "cgi.lsp")
(println (string "Content-type: text/html\r\n\r\n"
    [text]<!doctype html>
    <html>
     <head>
     <title>Title</title>
     </head>
    <body>
 [/text]))

(set 'search-string (CGI:get "userinput"))

(println (format [text]
        <form name="form" class="dialog" method="GET">
             <fieldset>
                 <input type="text" value="search" name="userinput" >
                 <input type="submit" style="display:none"/>
             </fieldset>
        </form>[/text]))

(unless (nil? search-string)
    (println " I couldn't be bothered to search for \"" search-string "\""))

(println [text]
      </body>
    </html>
 [/text])

一个简单的 IRC 客户端

[编辑 | 编辑源代码]

以下代码实现了一个简单的 IRC(Internet Relay Chat)客户端,它展示了如何使用基本网络功能。脚本使用给定的用户名登录到服务器,并加入 #newlisp 频道。然后,脚本分为两个线程:第一个线程在连续循环中显示任何频道活动,而第二个线程在控制台中等待输入。两个线程之间唯一的通信是通过共享的 connected 标志进行的。

(set 'server (net-connect "irc.freenode.net" 6667)) 
(net-send server "USER newlispnewb 0 * :XXXXXXX\r\n") 
(net-send server "NICK newlispnewb \r\n") 
(net-send server "JOIN #newlisp\r\n") 

(until (find "366" buffer)
  (net-receive server buffer 8192 "\n")
  (print buffer))

(set 'connected (share))
(share connected true)

(fork
    (while (share connected)
      (cond
        ((net-select server "read" 1000) ; read the latest
            (net-receive server buffer 8192 "\n")
            ; ANSI colouring: output in yellow then switch back
            (print "\n\027[0;33m" buffer "\027[0;0m"))
        ((regex {^PING :(.*)\r\n} buffer) ; play ping-pong
            (net-send server (append "PONG :" (string $1 ) "\r\n"))
            (sleep 5000))
        ((net-error) ; error
            (println "\n\027[0;34m" "UH-OH: " (net-error) "\027[0;0m")
            (share connected nil)))
     (sleep 1000)))
 
(while (share connected) 
   (sleep 1000)
   (set 'message (read-line))
   (cond
     ((starts-with message "/")  ; a command?
          (net-send server (append (rest message) "\r\n"))
          (if 
            (net-select server "read" 1000)
            (begin
                (net-receive server buffer 8192 "\n") 
                (print "\n\027[0;35m" buffer "\027[0;0m"))))
     ((starts-with message "quit") ; quit
            (share connected nil))
     (true  ; send input as message
          (net-send server (append "PRIVMSG #newlisp :" message "\r\n")))))

(println "finished; closing server")
(close server)
(exit)
华夏公益教科书