锘??xml version="1.0" encoding="utf-8" standalone="yes"?>最新日韩在线视频,欧美日韩精品一二三区,久久精品国产77777蜜臀 http://m.shnenglu.com/kevinlynx/category/16250.html浣庤皟鍋氭妧鏈痏_ C/C++\MMORPG鏈嶅姟鍣╘妯″潡鏋舵瀯__ TODO錛歭inux env/read more books __Kevin Lynxzh-cnThu, 29 Sep 2011 12:53:16 GMTThu, 29 Sep 2011 12:53:16 GMT60浣跨敤Lisp鎼緩鐙珛鍗氬http://m.shnenglu.com/kevinlynx/archive/2011/09/29/157144.htmlKevin LynxKevin LynxThu, 29 Sep 2011 09:19:00 GMThttp://m.shnenglu.com/kevinlynx/archive/2011/09/29/157144.htmlhttp://m.shnenglu.com/kevinlynx/comments/157144.htmlhttp://m.shnenglu.com/kevinlynx/archive/2011/09/29/157144.html#Feedback1http://m.shnenglu.com/kevinlynx/comments/commentRss/157144.htmlhttp://m.shnenglu.com/kevinlynx/services/trackbacks/157144.html Author: Kevin Lynx Date: 9.29.2011 Contact: kevinlynx at gmail dot com

鏈枃鎻忚堪濡備綍浣跨敤Lisp宸ュ叿闆嗘惌寤轟竴涓畬鏁寸殑涓漢鍗氬绔欑偣銆備竴涓惌寤哄ソ鐨勪緥瀛愮珯鐐瑰彲浠ュ弬鐪嬫垜鐨勪釜浜哄崥瀹細http://codemacro.com銆?/p>

瑕佹惌寤轟竴涓嫭绔嬪崥瀹紝闇瑕佷袱鏂歸潰鐨勬敮鎸併備竴鏄崥瀹㈣蔣浠訛紝浜屾槸鏍規嵁閫夋嫨鐨勫崥瀹㈣蔣浠跺彇寰楀繀欏葷殑“紜歡“銆備緥濡傛垜榪欓噷浣跨敤鐨勬槸Lisp宸ュ叿闆嗭紝灝遍渶瑕佷竴涓彲浠ュ畬鍏ㄦ帶鍒剁殑鏈嶅姟鍣紝鎵浠ヨ繖閲屾垜闇瑕佷竴涓猇PS銆傚綋鐒訛紝璐拱涓涓悎閫傜殑鍩熷悕涔熸槸蹇呴』鐨勩備互涓嬪皢閽堝榪欎簺鍐呭鍋氭弿榪般?/p>

鑾峰彇VPS鍙婂煙鍚?/h3>

VPS鎻愪緵鍟嗗浗鍐呭浗澶栭兘鏈夊緢澶氥傛垜閫夋嫨鐨勬槸 rapidxen 錛?28M鍐呭瓨錛?騫?0鏉ョ編鍏冿紝綆楁槸鍥藉姣旇緝渚垮疁鐨勶紝閫熷害涓婅繕榪囧緱鍘匯?/p>

璐拱浜哣PS鍚庯紝鍙互榪涘叆鍚庡彴綆$悊欏甸潰瀹夎VPS鎿嶄綔緋葷粺銆傚悓鏍鳳紝鍥犱負鎴戜嬌鐢ㄧ殑鏄疞isp錛屾垜閫夋嫨瀹夎浜咲ebian 6.0 squeeze (minimal)64浣嶃傚疄闄呬笂鎴戞洿鍊懼悜浜?2浣嶏紝鍥犱負鎴戠殑PC緋葷粺灝辨槸32浣嶏紝鏂逛究嫻嬭瘯銆傚畨瑁呯郴緇熼潪甯哥畝鍗曪紝鍩烘湰闅忔剰璁劇疆涓嬪嵆鍙傚煎緱娉ㄦ剰鐨勬槸錛岄櫎浜嗕慨鏀箁oot瀵嗙爜澶栵紝鏈濂戒慨鏀逛笅ssh绔彛錛屽叿浣撹緗柟娉曞彲浠ュ彟琛屾悳绱€傛澶栵紝鍥犱負鍚庨潰鎴戜細浣跨敤nginx浣滀負HTTP鍓嶇鏈嶅姟鍣紝涓轟簡鏂逛究瀹夎nginx錛屾渶濂芥洿鏂頒笅杞歡婧愬垪琛紝緙栬緫etc/apt/source.list:

deb http://ftp.us.debian.org/debian squeeze main
deb http://packages.dotdeb.org stable all
deb-src http://packages.dotdeb.org stable all
deb http://php53.dotdeb.org stable all
deb-src http://php53.dotdeb.org stable all

璐拱VPS鏈涓昏鐨勶紝灝辨槸鑾峰彇鍒頒竴涓嫭绔婭P錛屽鍥撅細

imgs/vps.png

鐒跺悗鍙互鍘昏喘涔板煙鍚嶃傚悓鏍鳳紝涔熸湁寰堝鍩熷悕鏈嶅姟鍟嗐傝繖閲屾垜閫夋嫨鐨勬槸 godaddy 錛屾垜閫夋嫨鐨勫煙鍚峜odemacro.com涓騫?1緹庡厓銆傝喘涔頒簡鍩熷悕鍚庯紝灝遍渶瑕佸皢鍩熷悕鍜孷PS IP鍏寵仈璧鋒潵銆傝緇嗚緗篃鍙互鍙﹁鎼滅儲銆傝繖閲岀畝瑕佹彁涓嬶細鍦ㄦ垚鍔熺櫥鍏odaddy鍚庯紝閫夋嫨My Account錛岃繘鍏ヨ嚜宸辯殑鍩熷悕錛岄夋嫨DNS Manager錛岀劧鍚庢坊鍔犲煙鍚嶆槧灝勫嵆鍙紝濡傚浘錛?/p> imgs/domain.png

閫氳繃浠ヤ笂璁劇疆鍚庯紝浣犺喘涔扮殑鍩熷悕灝辨垚鍔熸寚鍚戜綘璐拱鐨刅PS鍦板潃浜嗐傚彲浠ラ氳繃ping鏉ヨ瀵熸槸鍚︽寚鍚戞垚鍔熴?/p>

浣跨敤Lisp鏋勫緩鍗氬緋葷粺

瑕佸湪VPS涓婂畨瑁呰蔣浠訛紝棣栧厛闇瑕丼SH涓婁綘鐨刅PS錛屼緥濡傦細ssh -p 1234 root@codemacro.com銆?/p>

榪欓噷浣跨敤鐨勮蔣浠墮泦鍖呮嫭錛?/p>

  • nginx錛學eb鏈嶅姟鍣?/li>
  • SBCL 錛孡isp緙栬瘧鍣ㄥ疄鐜?/li>
  • quicklisp 錛屽彲浠ユ柟渚胯嚜鍔ㄤ笅杞姐佸畨瑁匧isp搴撶殑宸ュ叿
  • hunchentoot 錛孡isp瀹炵幇鐨刉eb鏈嶅姟鍣紙涓嶇敤鐗規剰瀹夎錛?/li>
  • ext-blog 錛孡isp瀹炵幇鐨勫崥瀹㈢郴緇?/li>

瀹為檯涓婏紝鍙互瀹屽叏浣跨敤Lisp浣滀負Web鏈嶅姟鍣紝浣嗘垜鎷呭績鏁堢巼闂錛堝涓漢鍗氬鑰岃█瀹屽叏娌¤繖鍥炰簨錛夛紝鎵浠ヤ嬌鐢ㄤ簡nginx浣滀負Web鏈嶅姟鍣ㄥ墠绔紝灝唄unchentoot鏀懼湪鍚庨潰銆?/p>

瀹夎nginx

鍦ㄨ緗ソdebian杞歡婧愬悗錛屽畨瑁呴潪甯哥畝鍗?

apt-get install nginx

瀹夎瀹屽悗錛屽洜涓鴻灝咹TTP璇鋒眰杞彂緇橪isp鏈嶅姟鍣紝鎵浠ラ渶瑕佷慨鏀逛笅閰嶇疆:

vi /etc/nginx/sites-avaiable/default

灝?璇鋒眰媧懼彂緇橪isp鏈嶅姟鍣紙鍋囪鐩戝惉浜?000绔彛錛?

location / {
proxy_pass http://127.0.0.1:8000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}

鐒跺悗鍙互鍚姩nginx浜?

nginx

榪欎釜鏃跺欓氳繃嫻忚鍣ㄨ闂紝浼氬緱鍒?03 bad gateway鐨勯敊璇彁紺猴紝鍥犱負hunchentoot榪樻病寮鍚?/p>

瀹夎Lisp鐩稿叧杞歡

SBCL 鍚屾牱鍙互閫氳繃apt鐩存帴瀹夎:

apt-get instal sbcl

瑁呭ソSBCL鍚庯紝灝卞彲浠ヨ繘涓姝ュ畨瑁?quicklisp 銆傚彲浠ュ畬鍏ㄩ伒瀹坬uicklisp瀹樻柟緇欑殑瀹夎鏂規硶榪涜瀹夎銆傚ぇ姒傚氨鏄厛鑾峰彇quicklisp.lisp鏂囦歡錛岀劧鍚庡湪SBCL涓澆鍏ワ紝鏍規嵁鎻愮ず鍗沖彲銆傝繖閲屼笉鍐嶈禈榪般?/p>

瀹夎濂絨uicklisp鍚庯紝灝卞彲浠ヤ嬌鐢ㄥ畠瀹夎寰堝Lisp杞歡/搴撲簡銆俼uicklisp鍦ㄥ畨瑁呬竴涓狶isp搴撴椂錛屼細鑷姩涓嬭澆騫跺畨瑁呬緷璧栧簱錛屽氨鍍廰pt-get涓鏍楓傚洜涓篹xt-blog騫舵湭鏀跺叆鍒皅uicklisp鐨勮蔣浠跺垪琛ㄩ噷錛屾墍浠xt-blog闇瑕佹墜鍔ㄥ畨瑁呫傞鍏堬紝鍦ㄦ湰鍦幫紙闈濾PS涓婏級鑾峰彇ext-blog婧愮爜:

git clone git://github.com/kevinlynx/klprj.git

涓婇潰鐨刧it鏄垜涓漢瀛樹笢瑗跨敤鐨勶紝鏆傛椂娌″皢ext-blog鍗曠嫭鏀劇疆銆傝繘鍏ュ埌ext-blog鐩綍銆傝鐩綍涓嬫湁鍑犱釜鏂逛究鐨勮剼鏈彲浠ョ敤浜庡崥瀹㈢鐞嗐傞鍏堝皢ext-blog鎵撳寘騫朵笂浼犲埌VPS涓婏紝渚嬪:

./upload-dist.sh root@codemacro.com 1234 /home/test

璇ヨ剼鏈細璋冪敤make-dist.sh灝唀xt-blog鍏ㄩ儴婧愮爜鎵撳寘錛岀劧鍚庝嬌鐢╯cp鎷瘋礉璇ユ枃浠跺強update-blog.sh鍒癡PS鎸囧畾鐨勭洰褰曢噷錛堣繖閲屾槸/home/test錛夛紝鐒跺悗ssh涓奦PS銆傛湡闂翠細涓ゆ杈撳叆VPS緋葷粺鐨勫瘑鐮併傜劧鍚庝互涓嬫搷浣滃皢鍦╒PS涓婂畬鎴愩?/p>

棣栧厛榪涘叆鍒板垰鎵嶆嫹璐濇枃浠剁殑鐩綍:

cd /home/test

瑙e帇ext-blog.tar.gz:

tar xvf ext-blog.tar.gz

鐒跺悗ext-blog琚В鍘嬪埌/home/test/dist鐩綍銆傝繘鍏ユ鐩綍榪愯SBCL:

cd dist
sbcl

ext-blog鐩綍涓媎ep.lisp浼氫嬌鐢╭uicklisp瀹夎渚濊禆搴擄紝榪涘叆SBCL鍚庯紝杞藉叆璇ユ枃浠跺嵆鍙畨瑁呮墍鏈変緷璧栧簱錛岃繖鍙兘闇瑕佷竴鐐規椂闂?

(load "dep.lisp")

鍦ㄦ病鏈夊叾浠栭棶棰樹笅錛屽彲浠ユ殏鏃墮鍑篠BCL瀹屾垚涓浜涘叾浠栧噯澶囧伐浣溿?/p>

ext-blog鍦ㄦ渶榪戠殑鐗堟湰涓姞鍏ヤ簡楠岃瘉鐮佺敓鎴愬姛鑳斤紝榪欓渶瑕佷竴涓猵cf瀛椾綋鏂囦歡銆傚洜涓哄瓧浣撴枃浠朵竴鑸緝澶э紝鎵浠pload-dist.sh鑴氭湰騫舵病鏈夊皢璇ュ瓧浣撴枃浠舵墦鍖咃紝鎵浠ヨ繖閲岄渶瑕佹墜鍔ㄥ鍒訛紝鍚屾牱鍦ㄦ湰鍦扮殑ext-blog鐩綍涓?

scp -P 1234 data/wenquanyi_12ptb.pcf root@codemacro.com:/home/test/dist/data/

鍙﹀錛屽洜涓洪渶瑕佸皢Lisp瑙i噴鍣ㄦ斁緗湪緋葷粺鍚庡彴鎵ц錛岄伩鍏嶅叧鎺塖SH浼氳瘽鍚庣粓姝BCL榪涚▼錛屾墍浠ヨ繖閲岄渶瑕佷釜宸ュ叿gnu screen銆傚彲浠ヤ嬌鐢╝pt-get鏉ュ畨瑁?

apt-get install screen

鐒跺悗錛屼竴鍒囧氨OK浜嗐傚湪VPS涓婂彲浠ヤ嬌鐢╡xt-blog鐩綍涓嬬殑run-blog.sh鏉ヨ繍琛岃繖涓崥瀹紙棣栧厛紜畾VPS涓婄殑nginx寮鍚級:

./run-blog.sh

璇ヨ剼鏈細浣跨敤screen鍦ㄥ悗鍙板紑鍚竴涓猄BCL榪涚▼錛屽茍鑷姩杞藉叆ext-blog錛岀劧鍚庡湪8000绔彛涓婂紑鍚疕TTP鏈嶅姟銆傝繖涓惎鍔ㄨ繃紼嬪彲鑳戒細浣跨敤鍑犲崄縐掔殑鏃墮棿錛岀洿鎺trl+z閫鍑簊creen錛岃繖騫朵笉緇堟SBCL銆備竴孌墊椂闂村悗渚垮彲鍦ㄦ祻瑙堝櫒閲屾祴璇曘?/p>

璁劇疆鍗氬

濡傛灉涓鍒囨甯革紝姝ゆ椂閫氳繃嫻忚鍣ㄨ闂綘鐨勭珯鐐規椂錛屼細琚噸瀹氬悜鍒頒竴涓崥瀹㈠垵濮嬪寲欏甸潰錛屽涓嬶細

imgs/initblog.png

涓婂浘涓垜鏄湪鏈満嫻嬭瘯鐨勶紝鎵浠ュ煙鍚嶆槸localhost錛屽笇鏈涗笉鑷充簬浜х敓璇В銆傚垵濮嬪寲浠呴渶杈撳叆鐢ㄦ埛鍚嶅拰瀵嗙爜鍗沖彲錛屼互鍚庡彲閫氳繃璇ョ敤鎴峰悕鍜屽瘑鐮佽繘鍏ュ崥瀹㈠悗鍙扮鐞嗛〉闈€傚畬鎴愯繖涓姝ュ悗錛屽氨鍙互榪涘叆鍗氬鍚庡彴綆$悊欏甸潰鍋氭洿澶氱殑璁劇疆錛屼緥濡傚崥瀹㈡爣棰樼瓑銆?/p>

ext-blog鐨勭鐞嗛〉闈嬌鐢ㄤ簡emlog鍗氬緋葷粺鐨凜SS鍙婂叾浠栬祫婧愶紝鍥犳鏈夊悓瀛﹁寰楃鐞嗛〉闈㈠緢闈㈢啛灝變笉濂囨簡銆俥xt-blog鎻愪緵鍦ㄧ嚎緙栬緫鍗氬鍔熻兘錛屽悓鏃朵篃鏀寔綆鍗曠殑metaweblog API錛屽洜姝ゅ彲浠ヤ嬌鐢ㄤ竴浜涘崥瀹㈠鎴風鏉ュ彂琛ㄦ枃绔狅紙浠呮祴榪囨垜鑷繁鍐欑殑鍗氬瀹㈡埛绔痗l-writer錛夈?/p>

鏈鍚?/h3>

鏈枃鎻忚堪杈冧負綺楃暐錛屼富瑕佹槸寰堝緇嗚妭鎴戣嚜宸變篃璁頒笉娓呫傚鏈夐棶棰樺彲浠ュ彂閭歡緇欐垜銆?/p>

]]>鐢↙isp寮鍙戝崥瀹㈢郴緇燂紙WordPress椹敳錛?/title><link>http://m.shnenglu.com/kevinlynx/archive/2011/08/05/152563.html</link><dc:creator>Kevin Lynx</dc:creator><author>Kevin Lynx</author><pubDate>Fri, 05 Aug 2011 08:43:00 GMT</pubDate><guid>http://m.shnenglu.com/kevinlynx/archive/2011/08/05/152563.html</guid><wfw:comment>http://m.shnenglu.com/kevinlynx/comments/152563.html</wfw:comment><comments>http://m.shnenglu.com/kevinlynx/archive/2011/08/05/152563.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://m.shnenglu.com/kevinlynx/comments/commentRss/152563.html</wfw:commentRss><trackback:ping>http://m.shnenglu.com/kevinlynx/services/trackbacks/152563.html</trackback:ping><description><![CDATA[<p>4鏈堜喚鐨勬椂鍊欏熀浜巒uclblog鍐欒繃涓涓畝鍗曠殑鍗氬緋葷粺錛屼絾鏄洜涓哄啓寰椾笐錛屼唬鐮佽﹀悎搴﹂珮錛屽張鏈夊緢澶氱‖緙栫爜銆傚綋鐒秐uclblog鏈韓灝卞啓寰椾笉鎬庝箞鏍鳳紝鎵浠?鏈堝垎鐨勬椂鍊欏氨鐢↙isp鍐欎簡鏂扮増鐨別xt-blog銆傛敮鎸佽嚜瀹氫箟涓婚錛屽涓┈鐢蹭笂鍘誨儚妯″儚鏍楓?/p> <p>ext-blog鏄竴涓嬌鐢–ommon Lisp緙栧啓鐨勫崥瀹㈢郴緇熴傚熀浜庝箣鍓嶅熀浜巒uclblog淇敼鐨勭粡楠岋紝鏂扮殑ext-blog鏈澶х▼搴﹀湴灝嗗崥瀹㈡湰韜殑閫昏緫涓庡墠鍙版覆鏌撳垎紱誨紑錛屽茍涓旀坊鍔犱簡瀵逛富棰?(theme)鐨勬敮鎸併傚埗浣滄柊鐨勪富棰樺彲浠ラ殢渚挎壘涓涓猈ordPress鐨勪富棰橈紝鐒跺悗灝唒hp浠g爜緲昏瘧鎴怢isp浠g爜鍗沖彲銆?/p> <p>ext-blog搴曞眰浠g爜闈炲父灝戯紝鍏跺疄鍩烘湰鐨勫崥瀹㈢郴緇熷姛鑳芥湰鏉ュ氨涓嶅銆傚ぇ閮ㄥ垎鍔熻兘閮芥槸鍦?鏈堝垵瀹屾垚銆傞偅涓椂鍊欏叕鍙告瘡澶╁姞鐝紝涓嬬彮鍥炲幓鍚庤繕鍐欑偣Lisp浠g爜銆傚悗鏉ヨ秺鏁磋秺绱紝灝卞疄鍦ㄦ病閭e畬鍠勫畠鐨勫績鎯咃紝涓鎷栧氨鎷栧埌7鏈堝簳錛屽姛鑳介兘榪樹笉綆楀畬鍠勶紙鑷沖皯榪樺緱鍔犱釜rss瀵煎嚭鍚э紵錛夈?/p> <h3>鍏充簬涓婚寮鍙?/h3> <p>ext-blog涓昏鏈夊嚑涓〉闈㈡淳鍙戯紝瀵規瘡涓〉闈㈤兘媧懼彂緇欏叿浣撶殑涓婚妯″潡錛岃鍏跺畬鎴愭覆鏌撱傜紪鍐欎竴涓富棰樻湰璐ㄤ笂灝辨槸鐢熸垚html欏甸潰銆傚湪Lisp鐨勪笘鐣屼腑鏈夊緢澶氬簱鍙互鐢熸垚html銆俥xt-blog鐨勪富棰樹篃涓嶉檺鍒朵綘浣跨敤鍝竴涓猦tml鐢熸垚搴撱傜洰鍓嶆垜鑷繁縐繪鐨?涓猈ordPress涓婚錛屼嬌鐢ㄧ殑閮芥槸google鐨刢losure-template鐨凩isp縐繪鐗堟湰錛屽嵆cl-closure-template銆俢losure-template浼氫粠妯℃澘浜х敓鍑?Lisp鍑芥暟錛岃繖涓鐐規槸姣斿悓綾誨簱涓殑html-template鏂逛究涓鐐廣傚綋鐒訛紝浣滀負涓涓ā鏉胯璦錛屽唴緗垽鏂佸驚鐜垯鏄繀欏葷殑銆?/p> <h3>鍏充簬緗戠粶妗嗘灦</h3> <p>涓栫晫涓婂緢澶氭祦琛岀殑璇█閮芥湁嫻佽鐨刉eb寮鍙戞鏋躲侺isp鏂歸潰錛屾垜鏈寮濮嬮夌敤鐨勬槸Weblocks錛屾垜鐢氳嚦鐢ㄥ畠涓哄叕鍙稿啓浜嗕釜綆鍗曠殑璁㈤緋葷粺錛堣繖璁╀竴涓▼搴忓憳棰囨湁鑷豹鎰燂級銆備絾緇堢┒瑙夊緱Weblocks澶毦鐢紝澶嶆潅錛屼絾娌℃湁瀹為檯鍔熻兘銆傛垜鐢氳嚦闃呰浜嗗畠80%鐨勬簮浠g爜錛屼絾渚濈劧鑾峰彇涓嶅埌濡備綍鏇村ソ浣跨敤瀹冪殑鎬濇兂銆傜劧鍚庢伆濂芥垜鐪嬩簡浜汻ails渚嬪瓙錛岃櫧鐒舵垜涓嶆噦Ruby璇█錛堜緷鐒跺彲浠ョ湅鍒板緢澶氳璦鐗規ф湁Lisp鐨勫獎瀛愶級錛屼絾鐪嬫噦渚嬪瓙榪樹笉鏄ぇ闂銆傚悗鏉ユ垜鍐沖畾鑷繁鍐欎釜 Web妗嗘灦錛屽洜涓哄叾瀹炴垜涓昏闇瑕佺殑灝辨槸涓涓猽rl媧懼彂(route)錛屽氨鍍廟ails閭f牱銆傛垜鐢氳嚦涓烘鍋氫簡浜涜緇嗚璁★紝緇撴灉鍚庢潵涓嶅垢鍙戠幇Lisp閲屽凡緇忔湁涓涓被浼肩殑妗嗘灦浜嗭紝榪欏氨鏄疪estas銆俥xt-blog鍩轟簬Restas銆?/p> <h3>鍏充簬鍚庡彴綆$悊</h3> <p>鍚庡彴綆$悊榪欎笢瑗垮叾瀹炲彲瑕佸彲涓嶈銆傚氨綆楁病鏈夊悗鍙扮鐞嗭紝涔熷彲浠ラ氳繃澧炲己RPC鏉ュ疄鐜般備絾騫朵笉鏄瘡涓漢閮芥槸Lisper錛岀浉淇℃兂浜嗚Вext-blog鐨勪漢寰堝ぇ涓閮ㄥ垎閮芥槸鎯沖涔燣isp鐨勪漢銆傜患鍚堟潵鐪嬶紝鎷ユ湁涓涓悗鍙扮鐞嗗姛鑳斤紝鎻愪緵鏇村弸濂界殑鎿嶄綔鐣岄潰錛屼篃鏄潪甯告湁蹇呰鐨勩備絾鎴戠‘瀹炰笉鎿呴暱鍋氬墠鍙扮編鍖栫殑宸ヤ綔銆傚垢榪愬湴鏄垜灝嗘覆鏌撳拰閫昏緫鍒嗙寮浜嗭紝鍚庡彴綆$悊涔熺畻鏄富棰樼殑涓縐嶃傜劧鍚庯紝鎴戞妱浜唀mlog鍗氬緋葷粺鐨勫悗鍙扮鐞嗭紝濡傚墠鎵璇達紝涔熷氨鏄妸php浠g爜錛堣櫧鐒舵垜涔熶笉鎳俻hp錛夌炕璇戞垚lisp浠g爜銆?/p> <h3>鍏充簬寮婧?/h3> <p>ext-blog鏄畬鍏ㄦ湁鐞嗙敱鍙戝竷鍒癱ommon-lisp.net涓婄殑錛岀敋鑷寵繕鍙互鍔犲叆鍒皅uicklisp鐨勫簱鍒楄〃閲屻備絾鍓嶆彁鏄帓闄ゅ敖鍙兘澶氱殑 bug錛屽啓涓緋誨垪鑻辨枃鏂囨。錛屼互鍙婃渶閲嶈鐨勶紝瀵瑰叾榪涜闀挎湡緇存姢銆備笉騫哥殑鏄垜鐩墠娌℃湁榪欎釜鏃墮棿鍜岀簿鍔涖傛墍浠ワ紝鍙兘鏆傛椂鍦ㄨ繖閲屽彂甯冧笅浜嗐?/p><p><br /></p><p>瑕佸洿瑙傛晥鏋滅殑璇風Щ姝ヨ嚦鎴戠殑鐙珛鍗氬錛?a title="http://codemacro.com" >http://codemacro.com</a>銆傚叧浜巈xt-blog鏇存寮忕殑浠嬬粛璇風Щ姝ユ綃囷細<a title="http://codemacro.com/view/8" >http://codemacro.com/view/8</a>銆?/p><p>ps錛屼箣鍓嶈闃呮垜鐙珛鍗氬鐨凾X楹葷儲鏇存崲涓媟ss鍦板潃錛?a title="http://codemacro.com/feed" >http://codemacro.com/feed</a>錛岃屽崥瀹富欏典篃鏈濂芥崲鎴?a title="http://codemacro.com" >http://codemacro.com</a>銆?/p><p><br /></p><img src ="http://m.shnenglu.com/kevinlynx/aggbug/152563.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.shnenglu.com/kevinlynx/" target="_blank">Kevin Lynx</a> 2011-08-05 16:43 <a href="http://m.shnenglu.com/kevinlynx/archive/2011/08/05/152563.html#Feedback" target="_blank" style="text-decoration:none;">鍙戣〃璇勮</a></div>]]></description></item><item><title>Lisp瀹炶返錛氬紑鍙慠SS闃呰鍣?/title><link>http://m.shnenglu.com/kevinlynx/archive/2011/03/30/142991.html</link><dc:creator>Kevin Lynx</dc:creator><author>Kevin Lynx</author><pubDate>Wed, 30 Mar 2011 01:32:00 GMT</pubDate><guid>http://m.shnenglu.com/kevinlynx/archive/2011/03/30/142991.html</guid><wfw:comment>http://m.shnenglu.com/kevinlynx/comments/142991.html</wfw:comment><comments>http://m.shnenglu.com/kevinlynx/archive/2011/03/30/142991.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://m.shnenglu.com/kevinlynx/comments/commentRss/142991.html</wfw:commentRss><trackback:ping>http://m.shnenglu.com/kevinlynx/services/trackbacks/142991.html</trackback:ping><description><![CDATA[<div class="hvzpftn" id="lisp-rss" class="document"><h1 class="title">Lisp实践:开发RSS阅读器</h1><table rules="none" frame="void" class="docinfo"><col class="docinfo-name"></col><col class="docinfo-content"></col><tbody valign="top"><tr><th class="docinfo-name">Author:</th><td>Kevin Lynx</td></tr><tr><th class="docinfo-name">Date:</th><td>3.30.2011</td></tr><tr><th class="docinfo-name">Contact:</th><td>kevinlynx at gmail dot com</td></tr></tbody></table><div id="hvzpftn" class="tip"><p class="first admonition-title">Tip</p><p class="last">本文简要介绍了如何使用Lisp实现一个简单的RSS阅读器,对Lisp无兴趣的TX可以 只对RSS阅读器的实现思路稍作了解即可。</p></div><div class="hvzpftn" id="rss" class="section"><h1>一、RSS阅读器的实现</h1><p>RSS Reader的实现并不像它看上去那么复杂。当初在决定写这个作为Lisp练习时,甚至觉得 没有多少内容可做。其简单程度甚至用不了你启动一个慢速IDE的时间:D。对Lisp无兴趣的 TX只需要读完这一节即可,</p><div class="hvzpftn" id="id1" class="section"><h2>什么是RSS阅读器?</h2><p>RSS在实现上,可以说是XML的又一次扩张式的应用。因为RSS最重要的东西就是一个XML文件 。RSS主要用于Web中的内容同步。例如我们写的博客,门户网站的新闻,都是内容。Web服 务器将这些内容组织成XML,然后我们通过一个客户端来解析这些XML,就可以在不用直接访 问网站的情况下获取信息:</p><img src="http://m.shnenglu.com/images/cppblog_com/kevinlynx/cl-writer/201133093232/rss-overview.png" alt="imgs/rss-overview.png"></img><p>RSS阅读器就是这样一个从Web服务器通过RSS(表现形式为XML)来获取信息内容的工具。它 可以被实现为一个独立的客户端程序,也可以实现为像Google Reader这种网页形式。后者 其核心功能其实是Google服务器在做,取得信息后再发给用户。</p></div><div class="hvzpftn" id="id2" class="section"><h2>RSS文件</h2><p>上已提及,RSS的实现其实就是个XML文件。这个XML文件格式非常简单,例如:</p><pre class="literal-block"> <?xml version="1.0"?> <rss version="2.0"> <channel> <title>Liftoff News</title> <link>http://liftoff.msfc.nasa.gov/</link> <description>Liftoff to Space Exploration.</description> <item> <title>Star City</title> <link>http://liftoff.msfc.nasa.gov/news/2003/news-starcity.asp</link> <description>Oh no, you wrote another blog!</description> </item> </channel> </rss> </pre><p>我们身边到处都是RSS文件,例如 <a href="http://m.shnenglu.com/rss.aspx" class="reference external">http://m.shnenglu.com/rss.aspx</a> 。RSS文件的框架大 致为:</p><pre class="literal-block"> <rss> <channel> <item> </item> <item> </item> ... </channel> </rss> </pre><p>对,其框架就是这样,一个channel节点,其下若干个item节点。举例来说, <strong>CPPBLOG首页就 是一个channel,该channel下有若干原创文章,每篇文章就是一个item。</strong> 无论是channel ,还是item,都会有很多属性,例如title/description/link,有些属性是RSS规范里要求 必须有的,有的是可选的。</p></div><div class="hvzpftn" id="id3" class="section"><h2>交互过程</h2><p>那么,服务器和客户端是如何交互的呢?首先,服务器上的程序针对其某个页面,生成对应 的RSS文件。这个RSS文件基本上是有固定的URL的。客户端每次获取内容时,就从这个固定 的URL获取这个RSS文件。客户端获取到这个RSS文件后,解析之,再呈现给用户。这就是整 个过程。这个过程中客户端与服务器的交互,全部是正常的HTTP请求。</p><p>而RSS阅读器,如果做得足够简单,则只需要从指定的地方获取到RSS文件,然后解析这个 XML文件,然后以相对友好的形式显示即可。</p></div><div class="hvzpftn" id="id4" class="section"><h2>扩展</h2><p>虽然RSS阅读器在核心功能上很简单,但是作为一个可以使用的工具,依然有很多功能点需 要实现。基本功能包括:</p><ul class="simple"><li>记录用户关注的RSS</li><li>缓存某个RSS过去一段时间更新的内容</li><li>对HTTP回应的处理,最重要的就是重定向处理</li></ul><p>我们还可以做很多扩展,例如Google Reader之类的在线RSS阅读器。这些阅读器的RSS抓取 功能做在服务器端,它们除了上面提到的基础功能外,还会包含内容分类,给内容打一些 标签,分析用户的订阅习惯然后推荐类似的内容等等。</p></div></div><div class="hvzpftn" id="lisp" class="section"><h1>二、Lisp实现</h1><p>本节描述在Lisp中实现上文的内容。主要包括: <strong>通过HTTP请求获取到RSS文件、解析RSS文件 。</strong></p><div class="hvzpftn" id="id5" class="section"><h2>获取RSS文件</h2><p>Lisp虽然历史悠久,但其扩展库标准却做得很拙劣。偏应用级的扩展库要么由编译器实现提 供,要么就得自己在网上找。一方面使用者希望库使用起来方便,另一方面库开发者在跨编 译器实现方面也头疼不已。所幸现在有了quick lisp,安装第三方库就像Ubuntu里安装软件 一样简单(大部分)。</p><p>socket支持就是面临的第一个问题。不过我这里并不考虑跨编译器实现的问题,直接使用 SBCL里的socket接口。</p><p>要获取RSS文件,只需要连接Web服务器,发起HTTP的GET请求即可。当然,建立TCP连接,组 建HTTP请求包,就不是这里的讨论了。我们还是拿CPPBLOG首页的RSS为例,该RSS的URL为:</p><pre class="literal-block"> http://m.shnenglu.com/rss.aspx </pre><p>拆分一下,得到host为m.shnenglu.com(即我们要connect的地址),rss的uri为 /rss.aspx(即HTTP请求里的文件URI),于是建立HTTP请求包:</p><pre class="literal-block"> GET /rss.aspx HTTP/1.0 Host: m.shnenglu.com </pre><p>关于HTTP请求的一些基础知识,可以参考我很早前写的一篇博客:<<a href="http://m.shnenglu.com/kevinlynx/archive/2008/07/30/57521.aspx" class="reference external">实现自己的http服务器</a>>。 正常情况下,Web服务器就会返回RSS的文件内容。然后我们就可以继续解析。</p></div><div class="hvzpftn" id="id6" class="section"><h2>解析RSS</h2><p>RSS本身是一个XML格式的文件。之前连接Web服务器发起HTTP请求没有用到第三方库,但是 解析XML文件不是几十来行代码能搞定的事情,所以这里需要选用一个第三方库。</p><p>我用的是s-xml,这个库在我之前的 <a href="http://m.shnenglu.com/kevinlynx/archive/2011/03/13/141713.aspx" class="reference external">关于Lisp的文章</a> 中提到过。s-xml与我之前在C++ 领域见到的XML解析库最大的不同点在于,它提供的API是基于事件模式的。意思是说,你不 要去查询某个element的值是多少,当我解析到的时候会告诉你。事件模式的编程方式自然 离不开回调函数:</p><pre class="literal-block"> (s-xml:start-parse-xml stream (make-instance 's-xml:xml-parser-state :new-element-hook #'decode-rss-new-element :finish-element-hook #'decode-rss-finish-element :text-hook #'decode-rss-text))) </pre><p>与s-xml交互的也就是上面代码里提到的三个函数:new-element-hook, finish-element-hook , text-hook。这种类型的接口导致解析代码大量减少,但不利于理解。我们要在整个解析 过程中传递数据,需要通过与s-xml交互的函数参数(当然不会蠢到去用全局变量)。</p><p>解析过程中通过往函数参数指定的对象身上塞数据完成,整个解析实现也就几十行代码。 文章尾可下载代码看看。</p></div><div class="hvzpftn" id="id7" class="section"><h2>显示出来</h2><p>通过上面两步,我们得到了RSS文件、解析出了具体内容,最后一步就是呈现出来看看。RSS 文件里每个Item都是一篇文章(新闻之类),这个文章内容可直接包含HTML标记,说白了, 这些内容就是直接的HTML内容。要显示这些内容,最简单的方法就是把一个RSS转换成一种 简单的HTML文件,以供阅读。</p><p>这里就涉及到HTML generator,几乎所有的Lisper都会写一个HTML产生器(库)(虽然目前 我还没写)。这种库的作用就是方便地输出HTML文件。</p><p>Lisp相对于其他语言很大的一个特点,或者说是优点,就是其语言本身的扩展能力。这种扩 展不是简单的添加几个函数,也不是类,而是提供一些就像语言本身提供的特殊操作符一样 的东西。而HTML generator正是这种东西大放异彩的地方。这种感觉有点像在C++中通过模 板造出各种增强语言特性的东西一样(例如boost/loki)。</p><p>因为我这里只是输出简单的HTML文件,何况我对HTML的标记了解的也不多,也懒得再花经历 。所以我暂时也就将就了些土方法:</p><pre class="literal-block"> (with-output-to-string (stream) (let ((channel (rss-channel rss))) ;取出channel对象 (format stream "<html><head><title>~a</title></head>" (get-property channel :|title|)) ;取出channel的title </pre><p>最后组合一些接口,即可将整个过程联系起来,导出html文件:</p><pre class="literal-block"> (cl-rss-test:test-rss-http :uri "/news/newshot/hotnewsrss.xml" :host "cd.qq.com") </pre><p>然后在浏览器里查看,如图:</p><img src="http://m.shnenglu.com/images/cppblog_com/kevinlynx/cl-writer/201133093232/screenshot.png" alt="imgs/screenshot.png"></img></div><div class="hvzpftn" id="id8" class="section"><h2>其他</h2><p>当一些代码可以工作起来的时候,就可以着手测试这批代码。然后我就用这个工具测试我 Google Reader里订阅的一些RSS。最大的问题,就是关于HTTP重定向的问题。</p><p>当服务器返回301或者302的错误信息时(HTTP回应),就标示请求的URI被移动到了其他地 方,客户端需要访问新的地址。这个其实查查 <a class="reference external">HTTP的规范</a> 就可以轻易解决。重定向时, 新的URI被指定在Response Header里的Location域,取出来发起第二次请求即可。</p><p><a href="http://m.shnenglu.com/Files/kevinlynx/cl-rss.tar.gz" class="reference external">下载代码</a></p></div></div><div class="hvzpftn" id="id9" class="section"><h1>参考文档</h1><ul class="simple"><li>HTTP规范: <a class="reference external">http://www.w3.org/Protocols/rfc2616/rfc2616.html</a></li><li>RSS2.0规范: <a class="reference external">http://feed2.w3.org/docs/rss2.html</a></li></ul><p>;;EOF;;</p></div></div><img src ="http://m.shnenglu.com/kevinlynx/aggbug/142991.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.shnenglu.com/kevinlynx/" target="_blank">Kevin Lynx</a> 2011-03-30 09:32 <a href="http://m.shnenglu.com/kevinlynx/archive/2011/03/30/142991.html#Feedback" target="_blank" style="text-decoration:none;">鍙戣〃璇勮</a></div>]]></description></item><item><title>Lisp涓鐬ワ細澧炲己鍨嬪彉閲廠ymbolhttp://m.shnenglu.com/kevinlynx/archive/2011/03/22/142462.htmlKevin LynxKevin LynxTue, 22 Mar 2011 03:33:00 GMThttp://m.shnenglu.com/kevinlynx/archive/2011/03/22/142462.htmlhttp://m.shnenglu.com/kevinlynx/comments/142462.htmlhttp://m.shnenglu.com/kevinlynx/archive/2011/03/22/142462.html#Feedback4http://m.shnenglu.com/kevinlynx/comments/commentRss/142462.htmlhttp://m.shnenglu.com/kevinlynx/services/trackbacks/142462.html

Lisp涓鐬ワ細澧炲己鍨嬪彉閲廠ymbol

Author: Kevin Lynx
Date: 3.21.2011
Contact: kevinlynx at gmail dot com

Note

鏈枃鎻忚堪鐨凩isp涓昏鎸嘗isp鐨勬柟璦Common Lisp銆?/p>

鍙橀噺錛屾槸鎵鏈夌紪紼嬭璦閲岄兘鏈夌殑璇硶姒傚康銆傚湪C/C++涓紝鍙橀噺鐢ㄤ簬鏍囩ず涓涓唴瀛樺湴鍧錛岃屽彉 閲忓悕鍒欏湪璇硶灞傞潰涓婁唬琛ㄨ繖涓湴鍧銆傚綋閾炬帴鍣ㄦ渶緇堥摼鎺ユ垜浠殑紼嬪簭鏃訛紝灝卞皢榪欎簺鍚嶅瓧鏇挎崲 涓哄疄闄呯殑鍦板潃銆傚湪鍏朵粬璇█涓紝鍙橀噺铏界劧鎴栧鎴栧皯鏈夊叾浠栦笉鍚岀殑鍚箟錛屼絾涔熷ぇ鑷村姝ゃ?/p>

Lisp涓殑鍙橀噺涔熷樊涓嶅榪欐牱錛屼絾鑻ュ皢variable鍜孡isp涓殑 symbol 鏀懼湪涓璧鳳紝鍒欏灝戜細 甯︽潵浜涘洶鎯戙?/p>

Lisp涓殑“鍙橀噺"

寰堝鏁欐巿Lisp鐨勪功涓紝澶ф浼氱畝鍗曞湴鍛婅瘔鎴戜滑鍙互浣跨敤濡備笅鐨勬柟寮忓畾涔変竴涓叏灞鍙橀噺 [1].

(defparameter *var* 1)

濡備笂浠g爜錛屾垜浠究瀹氫箟浜嗕竴涓叏灞鍙橀噺 *var*[2] 錛屽畠琚垵濮嬪寲涓烘暟鍊?銆傚悓鏍鳳紝鎴戜滑 榪樺彲浠ヤ嬌鐢ㄥ彟涓縐嶅熀鏈浉鍚岀殑鏂瑰紡:

(defvar *var* 1)

闄や簡鍏ㄥ眬鍙橀噺錛屾垜浠繕鍙互瀹氫箟灞閮ㄥ彉閲忋備絾灞閮ㄥ彉閲忕殑瀹氫箟紼嶆樉楹葷儲錛堝嵈鍙兘鏄彟涓縐? 璁捐鑰冭檻錛夈傚畾涔夊眬閮ㄥ彉閲忛渶瑕佷嬌鐢ㄤ竴浜涘畯錛屾垨鑰呯壒孌婅繍綆楃錛屼緥濡?

(let ((var 1))
(format t "~a" var))

濂戒簡錛屽氨榪欎簺浜嗐侺isp涓叧浜庡彉閲忕殑緇嗚妭錛屼篃灝辮繖浜涖備綘鐢氳嚦鑳界敤浣犲湪C/C++涓殑緇忛獙鏉ョ 鎺竴鍒囥備絾鏄紝鎴戜滑寰堝揩灝辯湅鍒頒簡寰堝鍥版儜鐨勫湴鏂廣?/p>

鎴戦亣鍒扮殑絎竴涓洶鎯戠殑鍦版柟鏉ユ簮浜庡嚱鏁幫紝閭d箞絳夋垜璁茶鍑芥暟鍐嶆潵鍒嗕韓涓嬪潕鍧楓?/p>

Lisp涓殑鍑芥暟

Lisp涓殑鍑芥暟緇濆涓嶅鏉傦紝浣犵粷瀵逛笉鐢ㄦ媴蹇冩垜鍦ㄥ拷鎮犱綘 [3] 銆備綔涓轟竴闂ㄥ嚱鏁板紡璇█錛屽叾棣栬 浠誨姟灝辨槸鍔犲己鍑芥暟榪欎釜涓滆タ鍦ㄦ暣涓璦閲岀殑鍔熻兘銆傚鏋滀綘鍠滄騫塊槄鍚勭涓庝綘宸ヤ綔涓嶇浉騫茬殑 鎶鏈紝浣犺偗瀹氬凡緇忓寰堝鍑芥暟寮忚璦涓栫晫涓殑姒傚康鐣ユ湁鑰抽椈銆備緥濡傞棴鍖咃紝浠ュ強first class type [4] 銆?/p>

Lisp涓殑鍑芥暟灝辨槸first class type銆傝繖浠涔堟剰鎬濆憿錛熺洿鐧芥潵璇達紝 Lisp涓殑鍑芥暟鍜屽彉閲? 娌′粈涔堝尯鍒紝浜湁鍚岀瓑寰呴亣 銆傝繘涓姝ユ潵璇達紝鍙橀噺fn鐨勫煎彲浠ユ槸鏁板?錛屼篃鍙互鏄瓧絎︿覆 "hello"錛岀敋鑷蟲槸鏌愪釜鍑芥暟銆傝繖鍏跺疄灝辨槸C++紼嬪簭鍛樿鐨刦unctor銆?/p>

Lisp涓畾涔夊嚱鏁伴潪甯哥畝鍗?

(defun add2 (x)
(+ 2 x))

榪欐牱錛屾垜浠氨瀹氫箟浜嗕竴涓悕涓篴dd2錛屾湁1涓弬鏁幫紝1涓繑鍥炲肩殑鍑芥暟銆傝璋冪敤璇ュ嚱鏁版椂錛屽彧闇 瑕?(add2 2) 鍗沖彲銆傝繖綆鐩村拰鎴戜滑鍦↙isp涓畬鎴愪竴涓姞娉曚竴妯′竴鏍?(+ 2 3)

Lisp浣滀負涓闂ㄥ嚱鏁板紡璇█錛屽叾鍑芥暟涔熻兘浣滀負鍙︿竴涓嚱鏁扮殑鍙傛暟鍜岃繑鍥炲?[5]

(defun apply-fn (fn x)
(funcall fn x))

apply-fn鍑芥暟絎竴涓弬鏁版槸涓涓嚱鏁幫紝瀹冧嬌鐢╢uncall鍑芥暟闂存帴鍦拌皟鐢╢n鎸囧悜鐨勫嚱鏁般備綔涓? 涓涓狢++紼嬪簭鍛橈紝榪欑畝鐩村お濂界悊瑙d簡錛岃繖瀹屽叏灝辨槸涓涓嚱鏁版寚閽堢殑璇硶緋栧槢銆備簬鏄紝鍋囪鎴? 浠浣跨敤apply-fn鏉ラ棿鎺ヨ皟鐢╝dd2鍑芥暟:

(apply-fn add2 2) ;; wrong

鍙槸榪欐槸涓嶅鐨勩傛垜浠渶瑕侀氳繃鍙︿竴涓壒孌婃搷浣滅鏉ュ畬鎴愯繖浠朵簨:

(apply-fn #'add2 2) ;; right

#'鎿嶄綔絎︾敤浜庡皢add2瀵瑰簲鐨勫嚱鏁板彇鍑烘潵錛岃繖涔堣褰撶劧涓嶅ぇ鍑嗙‘銆侫gain錛屼綔涓轟竴涓狢++紼嬪簭鍛? 錛岃繖綆鐩村氨鏄釜鍙栧湴鍧鎿嶄綔絎?amp;鐨勮娉曠硸鍢涖傚ソ鍚э紝榪欎箞鐞嗚В璧鋒潵浼間箮娌¢棶棰樹簡銆?/p>

Lisp涓兘鐢氳嚦鑳藉湪浠諱綍鍦版柟瀹氫箟涓涓嚱鏁幫紝渚嬪鎴戜滑鍒涘緩涓涓嚱鏁幫紝璇ュ嚱鏁拌繑鍥炲垱寤哄嚭鏉ョ殑 鍑芥暟錛岃繖鏄竴涓吀鍨嬬殑璁茶В浠涔堟槸 闂寘 鐨勪緥瀛?

(defun get-add-n (n)
#' (lambda (x)
(+ x n)))

鏃犺濡備綍錛実et-add-n鍑芥暟榪斿洖涓涓嚱鏁幫紝璇ュ嚱鏁版槸add2鍑芥暟鐨勬硾鍨嬪疄鐜般傚畠鍙互灝嗕綘浼犲叆 鐨勫弬鏁板姞涓妌銆傝繖浜涗唬鐮侀噷浣跨敤浜唋ambda琛ㄨ揪寮忋俵ambda琛ㄨ揪寮忕洿鐧芥潵璇達紝灝辨槸鍒涘緩涓涓瓧 闈笂鐨勫嚱鏁般傝繖鍙堟槸浠涔堟剰鎬濆憿錛熷氨鍍忔垜浠湪浠g爜涓啓鍑?錛屽啓鍑?hello"涓鏍鳳紝2灝辨槸涓瓧 闈笂鐨勬暟瀛楋紝"hello"灝辨槸涓瓧闈笂鐨勫瓧絎︿覆 [6] 銆?/p>

閭d箞錛屾昏岃█涔嬶紝閫氳繃lambda鍒涘緩涓涓嚱鏁頒綋錛岀劧鍚庨氳繃#'鎿嶄綔絎﹀嵆鍙緱鍒頒竴涓嚱鏁幫紝铏界劧 娌℃湁鍚嶅瓧銆傛湁浜嗕互涓婄煡璇嗗悗錛孉gain and again錛屼綔涓轟竴涓狢++紼嬪簭鍛橈紝寰堝揩鎴戜滑灝辮兘寰楀埌涓 涓▼搴忥細瀹氫箟鍙橀噺錛岀敤鍙橀噺鍘諱繚瀛樹竴涓嚱鏁幫紝鐒跺悗閫氳繃榪欎釜鍙橀噺鏉ヨ皟鐢ㄨ繖涓嚱鏁般傝繖鏄涔? 澶╃粡鍦頒箟鐨勪簨錛屽氨鍍忎箣鍓嶉偅涓氳繃鍙傛暟璋冪敤鍏舵寚鍚戠殑鍑芥暟涓鏍?

;; wrong
(defvar fn #' (lambda (x) (+ x 2)))
(fn 3)

榪欐牱鐨勪唬鐮佹槸涓嶅鐨勶紝閿欒鍙戠敓浜庣浜岃錛屾棤璁轟綘浣跨敤鐨凩isp瀹炵幇鏄摢縐嶏紝澶ф浼氬緱鍒板涓? 鐨勯敊璇俊鎭?

"The function FN is undefined."

鑰佸疄璇達紝榪欏凡緇忕畻鏄涔堟湁榪瑰彲寰殑閿欒鎻愮ず浜嗗晩銆傚皢浠ヤ笂浠g爜鍜屼箣鍓嶇殑apply-fn瀵規瘮錛屾槸 澶氫箞寰楃浼煎晩錛屽彲鎯滃氨鏄敊鐨勩傝繖鏄垜浠亣鍒扮殑絎竴涓悊瑙e亸宸鑷寸殑闂銆傚鏋滀綘榪樹笉娣? 鍏ユ帰絀訛紝浣犲皢浼氬湪榪欎竴鍧楅亣鍒版洿澶氶夯鐑︺傚強鏃跺湴鎷垮嚭浣犵殑鍕囨皵錛屾姭鑽嗘柀媯橈紝鍒ㄦ牴絀跺簳錛岀粷瀵? 鏄涔犵紪紼嬬殑濂藉搧璐ㄣ?/p>

“涓囨伓涔嬫簮“錛歋YMBOL

涓婃枃涓彁鍒扮殑鍙橀噺鍑芥暟涔嬬被錛屼箣鎵浠ヤ細鍦ㄦ煇浜涙椂鍊欎笌鎴戜滑鐨勭悊瑙e彂鐢熷亸宸紝騫朵笖鎬繪槸瀛樺湪浜? 紲炵鐨勫湴鏂規棤娉曡В閲娿傝繖瀹屽叏鏄洜涓烘垜浠悊瑙e緱澶墖闈㈠鑷淬侺isp涓殑Symbol鍙互璇村氨鏄煇 涓彉閲忥紝鎴栬呮煇涓嚱鏁幫紝浣嗚繖澶墖闈€侺isp涓殑Symbol鎷ユ湁鏇翠赴瀵岀殑鍚箟銆?/p>

Symbol鐨勫悕瀛?/h2>

灝卞儚寰堝璇█鐨勫彉閲忋佸嚱鏁板悕涓鏍鳳紝Lisp涓殑Symbol姣斿叾浠栬璦鍦ㄥ懡鍚嶆柟闈㈡洿鑷敱錛?鍙? 瑕佷綅浜?|'瀛楃涔嬮棿鐨勫瓧絎︿覆錛屽氨琛ㄧず涓涓悎娉曠殑Symbol鍚嶃?/strong> 鎴戜滑鍙互浣跨敤鍑芥暟 symbol-name鏉ヨ幏鍙栦竴涓猄ymbol鐨勫悕瀛楋紝渚嬪:

(symbol-name '|this is a symbol name|)
杈撳嚭錛?this is a symbol name"

'(quote)鎿嶄綔絎﹀憡璇塋isp涓嶈瀵瑰叾淇グ鐨勪笢瑗胯繘琛屾眰鍊?evaluate)銆備絾鍋囧娌℃湁榪欎釜鎿嶄綔絎? 浼氭庢牱鍛紵鍚庨潰鎴戜滑灝嗙湅鍒頒細鎬庢牱銆?/p>

Symbol鏈川

<ANSI Common Lisp>涓涔︿腑鏈夊彞璇濈湡姝e湴鎻ず浜哠ymbol鐨勬湰璐細 Symbols are real objects 銆傛槸鐨勶紝Symbols鏄璞★紝榪欎釜瀵硅薄灝卞儚鎴戜滑鐞嗚В鐨凜++涓殑瀵硅薄涓鏍鳳紝瀹冩槸涓涓? 澶嶅悎鐨勬暟鎹粨鏋勩傝鏁版嵁緇撴瀯閲屽寘鍚嫢騫插煙錛屾垨鑰呴氫織鑰岃█錛氭暟鎹垚鍛樸傚熺敤<ANSI Common Lisp>涓殑涓鍥撅細

imgs/symbol-obj.png

閫氳繃榪欏箙鍥撅紝鍙互鎻紑鎵鏈夎皽搴曘備竴涓猄ymbol鍖呭惈鑷沖皯鍥句腑鐨勫嚑涓煙錛屼緥濡侼ame銆乂alue銆? Function絳夈傚湪Lisp涓湁寰堝鍑芥暟鏉ヨ闂繖浜涘煙錛屼緥濡備笂鏂囦腑浣跨敤鍒扮殑symbol-name錛岃繖涓? 鍑芥暟鏈川涓婂氨鏄彇鍑轟竴涓猄ymbol鐨凬ame鍩熴?/p>

Symbol涓嶸ariable鍜孎unction鐨勮仈緋?/h2>

鑷劧鑰岀劧鍦幫紝緲婚槄Lisp鏂囨。錛屾垜浠細鍙戠幇鏋滅劧榪樻湁鍏朵粬鍑芥暟鏉ヨ闂甋ymbol鐨勫叾浠栧煙錛屼緥濡?

symbol-function
symbol-value
symbol-package
symbol-plist

浣嗘槸榪欎簺鍙堜笌涓婃枃鎻愬埌鐨勫彉閲忓拰鍑芥暟鏈変粈涔堣仈緋誨憿錛熺湡鐩稿彧鏈変竴涓紝 鍙橀噺銆佸嚱鏁扮矖鐣ユ潵 璇村氨鏄疭ymbol鐨勪竴涓煙錛屼竴涓垚鍛樸傚彉閲忓搴擵alue鍩燂紝鍑芥暟瀵瑰簲Function鍩熴備竴涓猄ymbol 榪欎簺鍩熸湁鏁版嵁浜嗭紝鎴戜滑璇村畠浠彂鐢熶簡緇戝畾(bind)銆?/strong> 鑰屾伆濂斤紝鎴戜滑鏈夊嚑涓嚱鏁板彲浠ョ敤浜庡垽 瀹氳繖浜涘煙鏄惁琚粦瀹氫簡鍊?

boundp ;鍒ゅ畾Value鍩熸槸鍚﹁緇戝畾
fboundp;鍒ゅ畾Function鍩熸槸鍚﹁緇戝畾

閫氳繃涓浜涗唬鐮佹潵鍥炲懗浠ヤ笂緇撹:

(defvar *var* 1)
(boundp '*var*) ; 榪斿洖鐪?
(fboundp '*var*) ; 榪斿洖鍋?
(defun *var* (x) x) ; 瀹氫箟涓涓悕涓?var*鐨勫嚱鏁幫紝榪斿洖鍊煎嵆涓哄弬鏁?
(fboundp '*var*) ; 榪斿洖鐪?

涓婇潰鐨勪唬鐮佺畝鐩存彮縐樹簡鑻ュ共鎯婂ぉ鍦版常楝肩鐨勭湡鐩搞傞鍏堬紝鎴戜滑浣跨敤鎴戜滑鐔熺煡鐨刣efvar瀹氫箟浜? 涓涓悕涓?*var* 鐨勫彉閲忥紝鍒濆間負1錛岀劧鍚庝嬌鐢╞oundp鍘誨垽瀹?*var* 鐨刅alue鍩熸槸鍚? 鍙戠敓浜嗙粦瀹氥傝繖鍏跺疄鏄錛?鍘熸潵瀹氫箟鍙橀噺灝辨槸瀹氫箟浜嗕竴涓猄ymbol錛岀粰鍙橀噺璧嬪鹼紝鍘熸潵灝? 鏄粰Symbol鐨刅alue鍩熻祴鍊鹼紒

鍏跺疄錛孡isp涓墍鏈夎繖浜涚鍙鳳紝閮芥槸Symbol銆?/strong> 浠涔堝彉閲忥紝浠涔堝嚱鏁幫紝閮芥槸嫻簯銆備笂闈㈢殑 渚嬪瓙涓紝绱ф帴鐫鐢╢boundp鍒ゆ柇Symbol *var* 鐨凢unction鍩熸槸鍚︾粦瀹氾紝榪欎釜鏃跺欎負鍋囥? 鐒跺悗鎴戜滑瀹氫箟浜嗕竴涓悕涓?*var* 鐨勫嚱鏁幫紝涔嬪悗鍐嶅垽鏂紝鍒欏凡鐒朵負鐪熴傝繖涔熸槸涓轟粈涔堬紝 鍦↙isp涓煇涓嚱鏁板彲浠ュ拰鏌愪釜鍙橀噺鍚屽悕鐨勫師鍥犳墍鍦ㄣ?/strong> 浠庤繖孌典唬鐮佷腑鎴戜滑涔熷彲浠ョ湅鍑? defvar/defun榪欎簺鎿嶄綔絎︺佸畯鎵鍋氫簨鎯呯殑鏈川銆?/p>

More More More

浜嬫儏灝辮繖鏍風粨鏉熶簡錛烵f course not銆傝繕鏈夊緢澶氫笂鏂囨彁鍒扮殑鐤戞儜娌℃湁瑙e喅銆傞鍏堬紝Symbol鏄? 濡傛澶嶆潅錛岄偅涔圠isp濡備綍鍐沖畾瀹冨湪涓嶅悓鐜涓嬬殑鍚箟鍛紵Symbol铏界劧鏄釜瀵硅薄錛屼絾瀹冨茍涓嶅儚 C++涓殑瀵硅薄涓鏍鳳紝瀹冨嚭鐜版椂騫朵笉鎸囦唬鑷繁錛佷笉鍚屽簲鐢ㄧ幆澧冧笅錛屽畠鎸囦唬鐨勪笢瑗夸篃涓嶄竴鏍楓傝繖 浜涙寚浠d富瑕佸寘鎷彉閲忓拰鍑芥暟錛屾剰鎬濇槸璇達細 Symbol鍑虹幇鏃訛紝瑕佷箞鎸囩殑鏄畠鐨刅alue錛岃涔堟槸 瀹冪殑Function銆?/strong> 榪欑鑳屽湴閲屽共鐨勪簨鎯咃紝涔熺畻鏄犳垚榪鋒儜鐨勪竴涓師鍥犮?/p>

褰撲竴涓猄ymbol鍑虹幇鍦ㄤ竴涓狶ist鐨勭涓涓厓绱犳椂錛屽畠琚鐞嗕負鍑芥暟銆傝繖涔堣鏈夌偣榪鋒儜浜猴紝鍥犱負 瀹冨甫榪涗簡Lisp涓唬鐮佸拰鏁版嵁涔嬮棿鐨勬ā緋婅竟鐣岀壒鎬с傜畝鍗曟潵璇達紝灝辨槸褰揝ymbol鍑虹幇鍦ㄤ竴涓嫭鍙? 琛ㄨ揪寮?s-expression)涓涓涓綅緗椂錛岀畻鏄釜鍑芥暟錛屼緥濡?

(add2 3) ; add2浣嶄簬絎竴涓綅緗紝琚綋浣滃嚱鏁板鐞?
(*var* 3) ; 榪欓噷*var*琚綋浣滃嚱鏁拌皟鐢紝榪斿洖3

闄ゆ涔嬪錛屾垜鑳芥兂鍒扮殑鍏朵粬澶ч儴鍒嗘儏鍐碉紝涓涓猄ymbol閮借鎸囦唬涓哄畠鐨刅alue鍩燂紝涔熷氨鏄褰? 浣滃彉閲忥紝渚嬪:

(*var* *var*) ; 榪欐槸姝g‘鐨勮鍙ワ紝榪斿洖1

榪欑湅璧鋒潵鏄涔堝彜鎬殑浠g爜銆備絾鏄繍鐢ㄦ垜浠笂闈㈣鐨勭粨璁猴紝渚垮彲杞繪槗瑙i噴錛氳〃杈懼紡涓涓涓? *var* 琚綋浣滃嚱鏁板鐞嗭紝瀹冮渶瑕佷竴涓弬鏁幫紱琛ㄨ揪寮忕浜岄儴鍒嗙殑 *var* 琚綋浣滃彉閲? 澶勭悊錛屽畠鐨勫間負1錛岀劧鍚庡皢鍏朵綔涓哄弬鏁頒紶鍏ャ?/p>

鍐嶆潵璇磋'(quote)鎿嶄綔絎︼紝榪欎釜鎿嶄綔絎︾敤浜庨槻姝㈠叾鎿嶄綔鏁拌姹傚箋傝屽綋涓涓猄ymbol鍑虹幇鏃訛紝 瀹冩繪槸浼氳姹傚鹼紝鎵浠ワ紝鎴戜滑鍙互鍒嗘瀽浠ヤ笅浠g爜:

(symbol-value *var*) ; wrong

榪欎釜浠g爜騫朵笉姝g‘錛屽洜涓?*var* 鎬繪槸浼氳姹傚鹼紝灝卞儚 (*var* *var*) 涓鏍鳳紝絎簩 涓?*var* 琚眰鍊鹼紝寰楀埌鏁板瓧1銆傝繖閲屼篃浼氬彂鐢熻繖縐嶄簨鎯咃紝閭d箞鏈緇堝氨絳夊悓浜?

(symbol-value 1) ; wrong

鎴戜滑璇曞浘鍘誨彇鏁板瓧1鐨刅alue鍩燂紝鑰屾暟瀛?騫朵笉鏄竴涓猄ymbol銆傛墍浠ワ紝鎴戜滑闇瑕乹uote榪愮畻絎?

(symbol-value '*var*) ; right

榪欏彞浠g爜鏄錛屽彇Symbol *var* 鏈韓鐨刅alue鍩燂紒鑰屼笉鏄叾浠栦粈涔堝湴鏂廣傝嚦姝わ紝鎴戜滑 渚垮彲浠ュ垎鏋愪互涓嬪鏉傛儏鍐?

(defvar *name* "kevin lynx")
(defvar *ref* '*name*) ; *ref*鐨刅alue淇濆瓨鐨勬槸鍙︿竴涓猄ymbol
(symbol-value *ref*) ; 鍙?ref*鐨刅alue錛屽緱鍒?name*錛屽啀鍙?name*鐨刅alue

鐜板湪錛屾垜浠敋鑷寵兘瑙i噴涓婃枃鐣欎笅鐨勪竴涓棶棰?

;; wrong
(defvar fn #' (lambda (x) (+ x 2)))
(fn 3)

緇檉n鐨刅alue璧嬪間竴涓嚱鏁幫紝 (fn 3) 褰撲竴涓猄ymbol浣滀負鍑芥暟浣跨敤鏃訛紝涔熷氨鏄彇鍏? Function鍩熸潵鍋氳皟鐢ㄣ備絾鍏禙unction鍩熶粈涔堜篃娌℃湁錛屾垜浠瘯鍥懼皢涓涓猄ymbol鐨刅alue鍩熷綋浣? Function鏉ヤ嬌鐢ㄣ傚浣曡В鍐寵繖涓棶棰橈紵鎯蟲兂錛宻ymbol-function鍙互鍙栧埌涓涓猄ymbol鐨? Function鍩?

(setf (symbol-function 'fn) #' (lambda (x) (+ x 2)))
(fn 3)

閫氳繃鏄劇ず鍦扮粰fn鐨凢unction鍩熻祴鍊鹼紝鑰屼笉鏄氳繃defvar闅愬紡鍦板鍏禫alue鍩熻祴鍊鹼紝灝卞彲浠ヤ嬌 (fn 3) 璋冪敤姝g‘銆傝繕鏈夊彟涓涓棶棰樹篃鑳借交鏄撹В閲?

(apply-fn add2 2) ; wrong

鏈剰鏄兂浼犲叆add2榪欎釜Symbol鐨刦unction鍩燂紝浣嗘槸鐩存帴榪欐牱鍐欑殑璇濓紝浼犲叆鐨勫叾瀹炴槸add2鐨? Value鍩?[7] 錛岃繖褰撶劧鏄笉姝g‘鐨勩傚姣旀紜殑鍐欐硶錛屾垜浠敋鑷寵兘鐚滄祴#'榪愮畻絎﹀氨鏄竴涓? 鍙朣ymbol鐨凢unction鍩熺殑榪愮畻絎︺傝繘涓姝ワ紝鎴戜滑榪樺彲浠ョ粰鍑哄彟涓縐嶅啓娉?

(apply-fn (symbol-function 'add2) 2)

娣卞叆鐞嗚В浜嬫儏鐨勮儗鍚庯紝浣犱細鍙戠幇浣犺兘鍐欏嚭澶氫箞鐏墊椿鐨勪唬鐮併?/p>

END

鍏充簬Symbol鐨勫唴瀹硅繕鏈夋洿澶氾紝渚嬪Package銆傛紜悊瑙h繖浜涘唴瀹逛互鍙婁粬浠箣闂寸殑鍏崇郴錛屾湁鍔? 浜庢洿娣卞埢鍦扮悊瑙isp銆?/p>

娉ㄨВ

[1] 鍦↙isp涓叏灞鍙橀噺鍙堣縐頒負dynamic variables
[2] Lisp涓寜鐓т範鎯氬父鍦ㄤ負鍏ㄥ眬鍙橀噺鍛藉悕鏃朵細鍔犱笂鏄熷彿錛屽氨鍍忔垜浠範鎯嬌鐢╣_涓鏍?/td>
[3] 鍥犱負鎴戠‘瀹炲湪蹇芥偁浣?/td>
[4] first class type錛屾湁浜虹炕璇戜負“涓絳夊叕姘?#8221;錛屾垜瑙夊緱鍘嬪姏宸ㄥぇ
[5] 鍗抽珮闃跺嚱鏁?/td>
[6] “瀛楅潰“涓昏鏄拡瀵硅繖浜涗俊鎭細琚瘝娉曞垎鏋愮▼搴忕洿鎺ュ鐞?/td>
[7] 榪欏彲鑳藉鑷存洿澶氱殑閿欒


]]>
鐢╨isp寮鍙戝崥瀹㈠鎴風http://m.shnenglu.com/kevinlynx/archive/2011/03/13/141713.htmlKevin LynxKevin LynxSun, 13 Mar 2011 05:19:00 GMThttp://m.shnenglu.com/kevinlynx/archive/2011/03/13/141713.htmlhttp://m.shnenglu.com/kevinlynx/comments/141713.htmlhttp://m.shnenglu.com/kevinlynx/archive/2011/03/13/141713.html#Feedback6http://m.shnenglu.com/kevinlynx/comments/commentRss/141713.htmlhttp://m.shnenglu.com/kevinlynx/services/trackbacks/141713.html

鐢╨isp寮鍙戝崥瀹㈠鎴風

Author: Kevin Lynx
Date: 3.13.2011

鏈榪戜竴鐩村湪瀛︿範Lisp榪欓棬璇█銆傚洖澶翠竴鐪嬶紝鍩烘湰涓婃帴榪?涓湀浜嗐傚垰寮濮嬫帴瑙isp鏄洜涓虹湅 浜?lt;Lisp鏈川>錛岀劧鍚庢垜鍙戠幇鏈夊緢澶氫漢瀹楁暀鑸湴蹇犺瘹榪欓棬璇█錛屼簬鏄氨鏉ヤ簡鍏磋叮銆?/p>

imgs/lisp_believer.png

褰撶劧騫朵笉鏄瘡嬈″洜涓烘煇綃囧啓寰楀緢geek鎶鏈枃绔犲氨鍘誨涔犳煇涓柊鐨勬妧鏈偣銆備竴涓湀鏃墮棿瀵規垜鏉? 璇磋繕鏄緢鐝嶈吹浜嗐備絾鏄疞isp緇濆鏄ぇ閮ㄥ垎紼嬪簭鍛橀兘鍊煎緱涓瀛︾殑璇█錛堝氨鍍廐askell涓鏍鳳級銆? 鎴戣兘緇欏嚭鐨勭畝鍗曠悊鐢卞寘鎷細

  • 澶ч儴鍒嗙▼搴忓憳鍙細鍛戒護寮忚璦錛圕/C++/C Like etc)錛岀己涔忓嚱鏁板紡璇█瑙e喅緙栫▼闂鐨勬? 鎯籌紙褰撶劧Lisp涓嶆槸綰嚱鏁板紡)
  • Lisp鏄粎嬈′簬Fortran鐨勫彜鑰佽璦錛屽緢澶氫紭縐鐨勮璦璁捐鎬濇兂鍦ㄧ幇浠g殑涓浜涜璦閲岄兘鎵懼緱 鍒?/li>
  • 瑁匓鍏氬繀澶?/li>

鍙︿竴鏂歸潰錛岀粨鍚堟垜涓涓湀浠ユ潵鐨勮涔﹀拰涓や釜緇冧範宸ョ▼鐨勫疄璺電粡鍘嗭紝鎴戣寰椾篃鏈変簺鐞嗙敱鍊煎緱浣? 涓嶅幓瀛︿範Lisp錛?/p>

  • 浣犱細Haskell鎴栬呭叾浠栧嚱鏁板紡璇█
  • 鎴戠洰鍓嶈繕鏄寰桳isp瀛︿範鏇茬嚎楂?澶ф鏄洜涓烘垜璇誨埌鐨勪功閮藉湪搴旂敤璇硶灞傚厹鍦堝瓙錛屼簨瀹炰笂 Lisp鐨勮娉曚箣緇熶竴錛屽叏鐗逛箞鐨勬槸s-expression)錛屼綘涓嶆効鎰忚姳璐硅繖浜涙垚鏈?/li>
  • you are too old bo to be a B

鍏充簬榪欑瘒鏂囨。

榪欑瘒鍗氬鎴戜嬌鐢╮eStructuredText鏍煎紡緙栧啓錛岀劧鍚庣敤docutls瀵煎嚭涓篽tml錛屽啀鐒跺悗浣跨敤榪欏洖 鐢╨isp寮鍙戠殑鍩轟簬metaweblog API鐨勫崥瀹㈠鎴風錛岃嚜鍔ㄥ彂甯冨埌CPPBLOG銆?/p>

浠栦滑鎬庝箞璇碙isp

鎴戝氨鎽樺綍浜涗功涓婄殑瑙傜偣(鍘嗗彶)錛?/p>

  • 1958騫達紝John McCarthy鍜屼粬鐨勫鐢熸悶鍑轟簡Lisp錛屽寘鎷叾絎竴涓疄鐜幫紝鏈鍒濊矊浼間篃鏄互涓 綃囪鏂囪搗澶?/li>
  • Lisp鍙互璁╀綘鍋氬叾浠栬璦閲屾棤娉曞仛鐨勪簨鎯?<ANSI common Lisp>)
  • 澶ч儴鍒嗙紪紼嬭璦鍙細鍛婅瘔浣犱笉鑳芥庢牱鍋氾紝榪欓檺鍒朵簡浣犺В鍐抽棶棰樼殑鎬濊礬錛孡isp not (<ANSI Common Lisp>)
  • Lisp璁╀綘浠isp鐨勬濈淮鎬濊冮棶棰橈紝鎹㈠埌鍏朵粬璇█浣犱細璇達細涓轟粈涔圶璇█灝變笉鏀寔榪欎釜鐗規? 鍛?Once you've leanred Lisp, you'll even dream in Lisp) (<Land Of Lisp>)
  • Lisp浠g爜鏇存竻鏅板湴浣撶幇浣犵殑鎯蟲硶(<Practical Common Lisp>)

And my opinion

鎴戝彲榪樻病鍒版妸Lisp鎹т笂澶╃殑鍦版銆傚鏋淟isp濡傛涔嬪ソ錛屼負浠涔堢敤鐨勪漢涓嶅錛?lt;Land Of Lisp> 閲屼綔鑰呮伆濂藉榪欎釜闂鍋氫簡鍥炵瓟(bla bla bla錛屾噿寰楃粏璇?銆?/p>

  • Lisp涔熸槸涓闂ㄦ潅鍜屽瀷椋庢牸鐨勮璦錛屽嚱鏁板紡銆佸懡浠ゅ紡銆侀潰鍚戝璞★紝浠ュ強鏈琚漢鍚規崸鐨勫畯緙栫▼ --紼嬪簭鑷繁鍐欒嚜宸?/li>
  • Lisp鐨勮鍙ュ叏閮ㄤ互(xxx xxx)鐨勫艦寮忓嚭鐜幫紝琚О涓簊-expression錛屾垜鐪嬬О涓烘嫭鍙瘋〃杈懼紡榪? 宸笉澶?/li>
  • Lisp姣忔潯璇彞閮芥湁榪斿洖鍊鹼紝娌″熀紜榪囧嚱鏁板紡緙栫▼鐨勫悓瀛︼紝if璇彞涔熸槸鏈夎繑鍥炲肩殑
  • 鍑芥暟寮忕紪紼嬭璦鐨勪竴涓噸瑕佺壒鎬у氨鏄棴鍖?closure)錛岃繖涓笢瑗跨敤鏉ラ伩鍏嶅叏灞鍙橀噺瀹炲湪澶? geek浜?/li>

寮濮嬪涔燣isp

Lisp涓嶅儚鏈変簺璇█錛屾湁涓洿鎺ョ殑鏈烘瀯鏉ョ淮鎶ゃ傛劅瑙夊畠鏇村儚C/C++涓鏍鳳紝鍙湁涓爣鍑嗭紝鐒跺悗鏈? 鑻ュ共緙栬瘧鍣紙瑙i噴鍣級瀹炵幇銆侺isp鍦ㄥ嚑鍗佸勾鐨勫彂灞曚腑錛屼駭鐢熶簡寰堝縐嶆柟璦銆傛柟璦涔熷氨鏄艦鍙? 紲炰笉鍙樼殑璇█鍙樼錛屾湰鏂囪鐨凩isp鍧囨寚Lisp鐨勬柟璦Common Lisp銆傚彟涓涓瘮杈冩湁鍚嶇殑鏂硅█鏄? Scheme錛屽叧浜庡悇涓柟璦鐨勭壒鐐癸紝<Land Of Lisp>閲屼篃緇欎簡涓涓浘鐗囷細

imgs/dialect.png

鍏朵腑錛屾渶宸﹁竟閭e彧wolf灝辨槸Common Lisp錛屽彸杈歸偅鍙猻heep灝辨槸Scheme銆?/p>

瑕佸涔燣isp錛岄鍏堝氨鏄夋嫨鏂硅█銆傜劧鍚庢渶閲嶈鐨勫氨鏄夋嫨涓涓紪璇戝櫒瀹炵幇銆備笘鐣屼笂鐭ュ悕鐨勬湁 鍗佸嚑縐嶅疄鐜幫紙涔熻鏇村錛夈備竴浜涘晢涓氱増鏈潪甯稿己澶э紝鐢氳嚦鑳界紪璇戝嚭寰堝皬鐨勬湰鍦頒唬鐮佹墽琛屾枃浠? 錛屼笉榪囦環鏍間篃涓嶈彶銆傚綋鐒朵篃鏈夊緢澶氬紑婧愬厤璐圭殑瀹炵幇錛屼緥濡侰LISP銆丼BCL銆傛垜閫夌敤鐨勬槸SBCL銆?/p>

SBCL浜や簰寮忓懡浠よ涓嶆敮鎸佹嫭鍙峰尮閰嶏紝鐢氳嚦娌℃湁杈撳叆鍘嗗彶銆傝瀹炵幇榪欎袱涓姛鑳斤紝鍙互瑁呬竴涓? lisp宸ュ叿錛歭inedit銆傚湪lisp鐨勪笘鐣屼腑錛岃鑾峰緱涓涓猯isp鐨勫簱瀹炲湪涓嶆槸浠舵柟渚跨殑浜嬨傚挨鍏舵槸 榪欎簺鍏嶈垂鐨勭紪璇戝櫒瀹炵幇錛屽茍涓嶅儚鏈変簺璇█涓鏍鳳紝鐩存帴闅忕紪璇戝櫒甯︿釜鍑犲崄M鐨勫簱銆?/p>

鐒跺悗灝辨湁浜唓uicklisp榪欎釜宸ュ叿銆傝宸ュ叿灝卞儚Ubuntu緋葷粺閲岀殑杞歡綆$悊鍣ㄤ竴鏍鳳紝浣犲彲浠ュ湪 lisp閲岀洿鎺ヨ幏鍙栨煇涓簱銆俼uicklisp媯鏌ヨ搴撴槸鍚﹀瓨鍦紝涓嶅瓨鍦ㄧ洿鎺ヤ粠瀹冪殑鏈嶅姟鍣ㄤ笂涓嬭澆浜? 鐒跺悗鑷姩瀹夎銆?/p>

姝ゅ錛屽湪lisp鐨勪笘鐣岄噷錛屽啓鍑烘潵鐨勭▼搴忎笉鍐嶆槸璺∣S銆侽S鐨勫樊寮傜敱緙栬瘧鍣ㄥ疄鐜版潵瑙e喅銆備絾鏄紝 鍐檒isp紼嬪簭鍗撮渶瑕佽冭檻璺ㄧ紪璇戝櫒瀹炵幇錛坋gg hurt錛夈傝繖涔熸槸涓棤姣斾激紲炵殑浜嬶紝姣旇法OS鏇翠激 紲炪傚洜涓篛S灝遍偅涔堝嚑涓紝浣唋isp鐨勭紪璇戝櫒瀹炵幇錛屾祦琛岀殑涔熸湁濂藉嚑涓?/p>

lisp鐨勪笘鐣岄噷錛屽伐紼嬬粍緇囦篃鏈夌壒孌婄殑涓濂楋紝灝卞儚makefile涓鏍鳳紝榪欏氨鏄痑sdf銆?/p>

鍗氬瀹㈡埛绔浣曞疄鐜?/h1>

鍍忔垜浠繖縐嶅熀鏈病鎺ヨЕ榪嘩eb寮鍙戠殑浜猴紝鍙兘瀹屽叏娌℃湁鎬濊礬鍘誨疄鐜頒竴涓崥瀹㈠鎴風銆備簨瀹炰笂 瀹炵幇璧鋒潵闈炲父綆鍗曘?/p>

浣跨敤榪囧叾浠栧崥瀹㈠鎴風錛堜緥濡俉indows Live writer錛夌殑浜鴻偗瀹氱煡閬搈etaweblog API錛屽湪閰? 緗鎴風鐨勬椂鍊欓渶瑕佸~鍏ャ備緥濡侰PPBLOG鐨勮繖涓湴鍧灝辨槸 http://m.shnenglu.com/kevinlynx/services/metaweblog.aspx銆傝繖涓〉闈㈠睍紺轟簡涓浜汚PI 璇存槑銆傝繖浜汚PI灝辨槸鍗氬瀹㈡埛绔拰鏈嶅姟鍣ㄨ繘琛屾搷浣滈氫俊鐨勬帴鍙c傛剰鎬濇槸璇達紝鏈嶅姟鍣ㄧ鎻愪緵榪? 榪欎簺鎺ュ彛錛屾垜浠殑瀹㈡埛绔皟鐢ㄨ繖浜涙帴鍙e嵆鍙備緥濡?

blogger.deletePost錛岃皟鐢ㄨ鎺ュ彛鍗沖彲鍒犻櫎涓綃囧崥瀹㈡枃绔?

浣嗘槸瀹㈡埛绔浣曡皟鐢ㄥ埌榪欎釜鎺ュ彛鍛紵榪欓渶瑕侀氳繃涓縐嶆柊鐨勬妧鏈紙鎴栬呰鏍囧噯錛夛紝鍗?xml rpc 銆俽pc澶у搴旇娓呮錛寈ml rpc鍏跺疄璇寸櫧浜嗭紝 灝辨槸鎶婃帴鍙h皟鐢ㄧ殑緇嗗垯濉炶繘 http 璇鋒眰鍙戠粰web鏈嶅姟鍣紝鏈嶅姟鍣ㄦ帴鏀惰姹傚畬鎴愭搷浣滃悗鍐嶆妸緇撴灉浠ttp鍥炲簲鐨勫艦寮忎涪緇欏鎴風錛? 鍗沖畬鎴愪簡涓嬈℃帴鍙h皟鐢?/strong> 銆?/p>

鑷充簬http璇鋒眰鍥炲簲鐨勭粏鍒欏氨涓嶆彁浜嗭紝鏃犻潪灝辨槸涓浜涚壒孌婃牸寮忕殑鏁版嵁錛岄氳繃tcp榪炴帴涓庢湇鍔″櫒 浜や簰榪欎簺鏁版嵁銆?/p>

鎵浠ワ紝鍩烘湰涓婏紝鏁翠釜榪囩▼榪樻槸闈炲父綆鍗曘傚浣曟潵灝嗚皟鐢ㄧ粏鑺傚榪沨ttp璇鋒眰錛屽垯鏄互xml rpc 鏍囧噯鏉ュ仛錛屽叾鏍煎紡姝eソ鏄痻ml鏍煎紡銆備婦涓緥瀛愬惂:

<?xml version='1.0'?>
<methodCall>
    <methodName>title_or_id</methodName>
        <params>
        </params>
</methodCall

褰撶劧榪欓儴鍒嗘暟鎹箣鍓嶅氨鏄嫢騫瞙ttp璇鋒眰鐨勬暟鎹傛湇鍔″櫒鍥炲簲涔熸槸浠ml鏍煎紡緇勭粐:

<?xml version='1.0'?>
<methodResponse>
    <params>
        <param>
            <value><string>Welcome to Zope.org</string></value>
        </param>
    </params>
</methodResponse>

鎴戜滑鐨勫崥瀹㈠鎴風鎵瑕佸仛鐨勶紝灝辨槸鎶婅繖浜涘崥瀹㈠彂甯冪浉鍏崇殑鎿嶄綔灝佽璧鋒潵鎻愪緵緇欎嬌鐢ㄨ呫傚簳灞? 瀹炵幇涓昏鍖呮嫭http璇鋒眰銆亁ml-rpc鐨勭粍緇囩瓑銆備綍鍐碉紝榪欎袱閮ㄥ垎鍦ㄥ悇涓璦閲岄兘鏈夊ぇ閲忕殑搴撳瓨 鍦紝lisp鑷劧涔熸湁銆?/p>

鎴戣繖閲岀洿鎺ラ夊彇浜唋isp鐨勪竴涓獂ml-rpc搴擄細s-xml-rpc錛屽熀鏈笂鐧炬潵琛屼唬鐮佸氨鍙互鎶婂悇涓姛 鑳借窇涓閬嶃備緥濡備互涓媗isp浠g爜灝卞疄鐜頒簡閫氳繃s-xml-rpc鍒犻櫎CPPBLOG鐨勪竴綃囨枃绔?

(defun delete-post (postid)
  (rpc-call
    "blogger.deletePost"
    postid
    "kevinlynx"
    "password"
    t))

鍙戝竷鍗氬涔熷緢綆鍗曪紝鏍規嵁metaweblog API鎺ュ彛鐨勮鏄庯紝鍙戝竷鍗氬鏃墮渶瑕佸~鍏呬竴涓粨鏋勪綋銆備絾 涓昏娑夊強鍒扮殑鏁版嵁浠呭寘鎷細鏂囩珷鍐呭銆佹枃绔犳爣棰樸佹枃绔犲垎綾伙紙鍙夛級:

(defun new-post (title context &optional (cates))
  (rpc-call
    "metaWeblog.newPost"
    ""
    "kevinlynx"
    "password"
    (new-post-struct title context cates)
    t))

鍊煎緱娉ㄦ剰鐨勬槸錛屽鏋滄枃绔犱腑鏈夎創鍥撅紝鍒欓渶瑕佷簨鍏堝皢鍥劇墖鏂囦歡涓婁紶鍒版湇鍔″櫒銆侰PPBLOG鐨? metaweblog API閲屾伆鏈堿PI鎻愪緵:

(defun new-media-object (filename)
  (rpc-call
    "metaWeblog.newMediaObject"
    ""
    "kevinlynx"
    "password"
    (new-media-object-struct filename)))

璇ュ嚱鏁拌鍏ュ浘鐗囨枃浠訛紝鐒跺悗璋冪敤metaWeblog.newMediaObject鎺ュ彛錛屽嵆鍙畬鎴愪笂浼犮備笂浼犳垚 鍔熷悗錛屾湇鍔″櫒浼氳繑鍥炶鍥劇墖鐨刄RL銆傜劧鍚庡湪鎴戜滑鐨勬枃绔犱腑灝卞彲浠ヤ嬌鐢ㄨ鍥劇墖浜嗐?/p>

瀹屾暣瀹炵幇鏂規

浠呬粎灝唌etaweblog鐨勪竴浜涙帴鍙e仛灝佽錛屽浜庝竴涓彲浠ヤ嬌鐢ㄧ殑鍗氬瀹㈡埛绔潵璇磋繕榪滆繙涓嶅銆傚ぇ 閮ㄥ垎鍚岀被宸ュ叿閮芥湁涓涓弸濂界殑GUI緙栬緫鐣岄潰銆傛垜騫朵笉鎵撶畻寮勪竴涓紪杈戠晫闈㈠嚭鏉ワ紝鍚冨姏涓嶈濂? 鐨勪簨鎯呫?/p>

鎴戠殑鎵撶畻鏄厛鐢ㄥ叾浠栧伐鍏峰鏂囩珷鍋氭帓鐗堝鐞嗭紝鏈鍚庡鍑轟負html鏍煎紡銆傚洜涓篊PPBLOG鏀寔鐩存帴 鍙戝竷涓涓猦tml鏂囦歡銆傜劧鍚庡湪鐢ㄨ繖涓猯isp宸ュ叿灝嗘暣涓枃浠朵綔涓哄崥瀹㈡枃绔犲唴瀹瑰彂甯冦?/p>

鎭板ソ鍏徃鏈榪戞墦綆楃敤reStructureText(rst)鏍煎紡鏉ョ紪杈戞枃妗o紝浣滀負鐔熸倝鎵嬫錛屾垜鍐沖畾鎷胯繖涓? 鏉ョ粌鎵嬨俽st鏍煎紡闈炲父綆鍗曪紝鍚寃iki鍛戒護寰堢浉浼箋傚湪vim閲岀紪杈戣鏂囦歡闈炲父鍚堥傦紝鍥犱負榛樿鏀? 鎸併傝鍥?

imgs/rst.png

鐢卞浘鍗沖彲鐪嬪嚭錛宺st鏄竴縐嶅崐鎵瑙佸嵆鎵寰楃殑鏍煎紡銆傚嵆錛氬畠閬靛驚浣犲湪緙栬緫鍣ㄩ噷鐨勬帓鐗堬紝鍚屾椂涔? 閫氳繃涓浜泃ag錛堜緥濡俰mage錛夋潵鎺у埗鏇翠赴瀵岀殑杈撳嚭銆?/p>

rst鏈夊緢澶氬墠绔伐鍏鳳紝鍙互灝唕st鏂囦歡杈撳嚭錛屼緥濡俽st2html.py灝卞彲浠ヨ緭鍑轟負html銆傚ソ鍚э紝鏈 鏈緇堟垜浠緱鍒頒簡html鏍煎紡鐨勫崥瀹㈡枃绔犮?/p>

浣嗘槸濡傛灉鏂囩珷涓嚭鐜頒簡鍥劇墖錛岃屽浘鐗囧熀鏈笂鍦ㄦ湰鍦幫紝杞垚html鍚庝篃鏄浉瀵硅礬寰勩傛垜闇瑕佹垜鐨? lisp writer(cl-writer)鑳借嚜鍔ㄦ壂鎻忔枃绔狅紝鍙戠幇鏈夊浘鐗囩殑鍦版柟錛屽氨鑷姩灝嗗浘鐗囦笂浼犮傛渶鎭跺績 鐨勬槸涓婁紶鍚庤繕寰楁浛鎹㈠浘鐗囧紩鐢ㄨ礬寰勩傝繖涓伐浣滃彲浠ュ湪rst鏍煎紡涓婂仛錛屼篃鍙互鍦ㄧ粨鏋滄牸寮廻tml 涓婂仛銆傞氳繃xml瑙f瀽搴撹В鏋恏tml姣旂洿鎺ヨВ鏋恟st鏍煎紡鏇寸畝鍗曪紝騫朵笖鍦ㄦ墿灞曟т笂鏇村ソ銆?/p>

鏈緇堣繖涓猦tml涓浘鐗囪礬寰勬浛鎹㈠伐浣滃彧娑堣椾簡涓嶅埌100琛宭isp浠g爜銆傝繖鍦ㄥ緢澶х▼搴︿笂涔熶緷璧栦簬 s-xml搴撶殑鎺ュ彛璁捐銆?/p>

鏈緇堝皝瑁呭ソ鐨勫彂甯冩帴鍙e涓嬶紝浠庤繖閲屼篃鍙互鐪嬪嚭錛屽嚱鏁板紡璇█閿葷偧鎴戜滑鍐欏嚭鍔熻兘鍗曚竴浠g爜搴? 鐭皬鐨勬帴鍙?

(defun writer-post-new (post-file &key (u (get-default-user))(cates))
  (read-post-file u post-file context title
                  (new-post u title context cates)))

END

鍒寚鏈涙垜鍙戝竷鐨勪唬鐮佽兘澶熻浣犱竴閿湪浣犵殑鍗氬涓婄暀涓?quot;this is a test"錛屼綘鐢氳嚦鍒寚鏈涘畠鑳? 鑳藉宸ヤ綔銆備絾濡傛灉浣犳湰鏉ュ氨鏄竴涓祫娣辯殑lisper錛屾垨鑰呰櫧鐒朵笉鏄痩isper浣嗗嵈鎵ф剰鎯崇湅鐪嬬粨鏋? 銆傝繖閲屾垜灝辯畝瑕佽璇村浣曡榪欎簺浠g爜嬈箰璧鋒潵:

  1. OS Ubuntu10.04錛屼笅杞藉畨瑁匰BCL錛屼笉浼氭湁闂錛?/p>

  2. 涓嬭澆瀹夎quicklisp錛屽畼鏂規枃妗and by hand錛岀畝鍗曚笉浼氭湁闂錛?/p>

  3. SBCL浜や簰鐜涓嬌鐢╭uicklisp瀹夎s-xml-rpc:

    (ql:quickload "s-xml-rpc")
    
  4. 瑁呰澆鎴戠殑浠g爜:

    (asdf:load-system :cl-writer)
    
  5. 鍦╤ome涓嬫坊鍔犻厤緗枃浠?cl-writer.lisp錛岄厤緗綘鍗氬淇℃伅錛屼緥濡?

    (in-package cl-writer)
    (setf *default-user* (make-cppblog-user "璐︽埛鍚?quot; "瀵嗙爜"))
    

    濡傛灉浣犵殑鍗氬涓嶅湪CPPBLOG錛岃櫧鐒朵篃璁鎬篃鏄痬etaweblog錛屼絾鎴戜笉鑳戒繚璇佹垚鍔燂紝閰嶇疆鏂囦歡鍒? 瑕佸鏉傜偣:

    (setf *default-user* (make-user-info :name "甯愭埛鍚?quot;
                          :password "瀵嗙爜" :host "m.shnenglu.com"
                          :url "/kevinlynx/services/metaweblog.aspx"))
    
  6. SBCL浜や簰鐜涓嬫祴璇?

    (in-package cl-writer)
    (new-post (get-default-user) "this is a test" "title")
    

涓嬭澆浠g爜

鏈鍚庯紝緇堜簬鏁插畬榪欑瘒鏂囩珷錛屾垜闇瑕侀氳繃浠ヤ笅姝ラ鏉ュ彂琛ㄥ畠:

in shell:
rst2html.py lisp_xml_rpc.rst lisp_xml_rpc.html
in SBCL:
(writer-post-new "lisp_xml_rpc.html")

;;EOF;;



]]>
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
      <noscript id="pjuwb"></noscript>
            <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
              <dd id="pjuwb"></dd>
              <abbr id="pjuwb"></abbr>
              亚洲欧洲av一区二区| 午夜亚洲激情| 欧美精品日韩| 欧美日韩一区二区精品| 欧美理论大片| 国产精品久久久久久久久动漫| 欧美国产丝袜视频| 欧美高清在线播放| 国产精品久久久对白| 国产噜噜噜噜噜久久久久久久久| 国产精品日韩专区| 在线播放不卡| 一本大道久久a久久精二百| 一区二区三区三区在线| 欧美与欧洲交xxxx免费观看| 久久人人爽爽爽人久久久| 亚洲国产成人91精品| 亚洲三级电影在线观看| 亚洲一区二区三区乱码aⅴ| 久久人人九九| 国产精品免费一区二区三区在线观看 | 亚洲一区二区三区激情| 在线一区二区三区四区| 午夜老司机精品| 欧美bbbxxxxx| 国产欧美日韩免费| 亚洲免费激情| 久久免费精品日本久久中文字幕| 亚洲激情不卡| 久久本道综合色狠狠五月| 欧美精品粉嫩高潮一区二区| 国产欧美在线播放| 一区二区电影免费在线观看| 久久久久综合网| 亚洲一区欧美二区| 欧美精品videossex性护士| 国产日韩av一区二区| 一级日韩一区在线观看| 免费成人网www| 午夜精品福利一区二区蜜股av| 欧美成人激情视频| 国内精品久久久久影院 日本资源| 亚洲一区二区三区四区中文| 91久久在线观看| 久久人人看视频| 极品裸体白嫩激情啪啪国产精品 | 欧美一区二区三区四区夜夜大片| 欧美成人免费一级人片100| 欧美在线999| 国产精品免费视频观看| 亚洲亚洲精品三区日韩精品在线视频| 模特精品在线| 久久久亚洲国产美女国产盗摄| 国产色产综合色产在线视频 | 亚洲人人精品| 欧美va亚洲va国产综合| 亚洲国产cao| 亚洲高清色综合| 免费欧美日韩国产三级电影| 好吊成人免视频| 免费不卡亚洲欧美| 快射av在线播放一区| 亚洲第一色中文字幕| 欧美成人精品| 欧美大片免费久久精品三p| 91久久线看在观草草青青| 欧美激情精品久久久久久| 欧美成人综合网站| 99国产一区| 一区二区欧美在线| 国产欧美精品在线| 可以免费看不卡的av网站| 久久久爽爽爽美女图片| 亚洲日本乱码在线观看| 亚洲人精品午夜在线观看| 国产精品高清网站| 久久精品日产第一区二区| 久久久91精品国产| 亚洲桃花岛网站| 亚洲午夜国产成人av电影男同| 国产精品盗摄一区二区三区| 亚洲免费视频观看| 欧美在线免费视频| 在线观看亚洲视频啊啊啊啊| 欧美激情第10页| 国产精品久久久久aaaa| 久久国产精品一区二区三区四区| 欧美一级视频| 亚洲日本久久| 亚洲欧美综合网| 亚洲精品一区在线观看香蕉| 99在线视频精品| 激情综合自拍| 一本久久青青| 狠狠久久亚洲欧美| 99精品99| 亚洲第一黄色| 亚洲一区二区三区在线视频| 在线观看视频一区二区| 一本久久a久久精品亚洲| 韩国一区二区三区美女美女秀| 亚洲国产一二三| 国产一区欧美日韩| 日韩一级网站| 亚洲精品欧美一区二区三区| 亚洲欧美日韩综合一区| 亚洲日本va在线观看| 午夜精品影院在线观看| 亚洲美女性视频| 久久久久久一区| 久久国产视频网站| 欧美日韩午夜剧场| 欧美韩国日本一区| 国产亚洲一区在线播放| 亚洲毛片在线| 最新热久久免费视频| 欧美一区二区高清在线观看| av成人免费在线观看| 久久亚洲欧美国产精品乐播| 性欧美8khd高清极品| 欧美日韩国产美| 亚洲狠狠婷婷| 亚洲欧洲在线视频| 免费久久99精品国产自| 久久久久99| 国产视频不卡| 亚洲欧美中文日韩在线| 欧美一区综合| 国产欧美一区二区三区视频| 亚洲视频免费看| 亚洲免费视频观看| 国产精品国产三级国产普通话99| 亚洲精品黄网在线观看| 亚洲美女视频| 欧美精品在线免费播放| 91久久久久久久久| 亚洲日本中文字幕区| 欧美成人综合网站| 亚洲欧洲日夜超级视频| 亚洲精品在线二区| 欧美精品日本| 在线视频免费在线观看一区二区| 一本一本大道香蕉久在线精品| 欧美区在线播放| 亚洲欧美国产77777| 久久久91精品国产一区二区精品| 国产精品日韩在线一区| 亚洲欧美日韩系列| 久久久久久69| 尤物九九久久国产精品的特点| 久久久伊人欧美| 亚洲电影毛片| av不卡在线看| 国产精品一区视频网站| 先锋影音国产精品| 免费的成人av| 亚洲午夜黄色| 国产一区 二区 三区一级| 久久精品亚洲一区二区三区浴池| 欧美91大片| 亚洲在线视频| 在线电影欧美日韩一区二区私密| 免费观看30秒视频久久| 亚洲三级毛片| 欧美专区在线观看| 亚洲人成人一区二区三区| 欧美午夜寂寞影院| 久久精品视频网| 亚洲精品国产欧美| 欧美主播一区二区三区| 亚洲国产一区二区三区a毛片| 欧美日韩一区二| 久久久噜噜噜久久| 99精品国产在热久久| 久久久久久久久伊人| av成人天堂| 在线观看一区视频| 国产精品国产馆在线真实露脸| 久久久精品日韩欧美| 亚洲免费观看高清完整版在线观看| 久久精品99国产精品日本| 亚洲精品亚洲人成人网| 国产三级欧美三级| 欧美日韩色综合| 另类欧美日韩国产在线| 亚洲专区国产精品| 最近中文字幕mv在线一区二区三区四区 | 国产精品国产a级| 免播放器亚洲一区| 亚洲欧美一区二区激情| 最新国产成人在线观看| 久久免费偷拍视频| 午夜精品久久久久久久久久久久久| 在线精品亚洲| 国产一区二三区| 欧美视频亚洲视频| 牛牛国产精品| 久久久999国产| 欧美一区高清| 亚洲你懂的在线视频|