锘??xml version="1.0" encoding="utf-8" standalone="yes"?> 鏈枃鎻忚堪濡備綍浣跨敤Lisp宸ュ叿闆嗘惌寤轟竴涓畬鏁寸殑涓漢鍗氬绔欑偣銆備竴涓惌寤哄ソ鐨勪緥瀛愮珯鐐瑰彲浠ュ弬鐪嬫垜鐨勪釜浜哄崥瀹細http://codemacro.com銆?/p>
瑕佹惌寤轟竴涓嫭绔嬪崥瀹紝闇瑕佷袱鏂歸潰鐨勬敮鎸併備竴鏄崥瀹㈣蔣浠訛紝浜屾槸鏍規嵁閫夋嫨鐨勫崥瀹㈣蔣浠跺彇寰楀繀欏葷殑“紜歡“銆備緥濡傛垜榪欓噷浣跨敤鐨勬槸Lisp宸ュ叿闆嗭紝灝遍渶瑕佷竴涓彲浠ュ畬鍏ㄦ帶鍒剁殑鏈嶅姟鍣紝鎵浠ヨ繖閲屾垜闇瑕佷竴涓猇PS銆傚綋鐒訛紝璐拱涓涓悎閫傜殑鍩熷悕涔熸槸蹇呴』鐨勩備互涓嬪皢閽堝榪欎簺鍐呭鍋氭弿榪般?/p>
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: 璐拱VPS鏈涓昏鐨勶紝灝辨槸鑾峰彇鍒頒竴涓嫭绔婭P錛屽鍥撅細 鐒跺悗鍙互鍘昏喘涔板煙鍚嶃傚悓鏍鳳紝涔熸湁寰堝鍩熷悕鏈嶅姟鍟嗐傝繖閲屾垜閫夋嫨鐨勬槸 godaddy 錛屾垜閫夋嫨鐨勫煙鍚峜odemacro.com涓騫?1緹庡厓銆傝喘涔頒簡鍩熷悕鍚庯紝灝遍渶瑕佸皢鍩熷悕鍜孷PS IP鍏寵仈璧鋒潵銆傝緇嗚緗篃鍙互鍙﹁鎼滅儲銆傝繖閲岀畝瑕佹彁涓嬶細鍦ㄦ垚鍔熺櫥鍏odaddy鍚庯紝閫夋嫨My Account錛岃繘鍏ヨ嚜宸辯殑鍩熷悕錛岄夋嫨DNS Manager錛岀劧鍚庢坊鍔犲煙鍚嶆槧灝勫嵆鍙紝濡傚浘錛?/p>
閫氳繃浠ヤ笂璁劇疆鍚庯紝浣犺喘涔扮殑鍩熷悕灝辨垚鍔熸寚鍚戜綘璐拱鐨刅PS鍦板潃浜嗐傚彲浠ラ氳繃ping鏉ヨ瀵熸槸鍚︽寚鍚戞垚鍔熴?/p>
瑕佸湪VPS涓婂畨瑁呰蔣浠訛紝棣栧厛闇瑕丼SH涓婁綘鐨刅PS錛屼緥濡傦細ssh -p 1234 root@codemacro.com銆?/p>
榪欓噷浣跨敤鐨勮蔣浠墮泦鍖呮嫭錛?/p>
瀹為檯涓婏紝鍙互瀹屽叏浣跨敤Lisp浣滀負Web鏈嶅姟鍣紝浣嗘垜鎷呭績鏁堢巼闂錛堝涓漢鍗氬鑰岃█瀹屽叏娌¤繖鍥炰簨錛夛紝鎵浠ヤ嬌鐢ㄤ簡nginx浣滀負Web鏈嶅姟鍣ㄥ墠绔紝灝唄unchentoot鏀懼湪鍚庨潰銆?/p>
鍦ㄨ緗ソdebian杞歡婧愬悗錛屽畨瑁呴潪甯哥畝鍗? 瀹夎瀹屽悗錛屽洜涓鴻灝咹TTP璇鋒眰杞彂緇橪isp鏈嶅姟鍣紝鎵浠ラ渶瑕佷慨鏀逛笅閰嶇疆: 灝?璇鋒眰媧懼彂緇橪isp鏈嶅姟鍣紙鍋囪鐩戝惉浜?000绔彛錛? 鐒跺悗鍙互鍚姩nginx浜? 榪欎釜鏃跺欓氳繃嫻忚鍣ㄨ闂紝浼氬緱鍒?03 bad gateway鐨勯敊璇彁紺猴紝鍥犱負hunchentoot榪樻病寮鍚?/p>
SBCL 鍚屾牱鍙互閫氳繃apt鐩存帴瀹夎: 瑁呭ソSBCL鍚庯紝灝卞彲浠ヨ繘涓姝ュ畨瑁?quicklisp 銆傚彲浠ュ畬鍏ㄩ伒瀹坬uicklisp瀹樻柟緇欑殑瀹夎鏂規硶榪涜瀹夎銆傚ぇ姒傚氨鏄厛鑾峰彇quicklisp.lisp鏂囦歡錛岀劧鍚庡湪SBCL涓澆鍏ワ紝鏍規嵁鎻愮ず鍗沖彲銆傝繖閲屼笉鍐嶈禈榪般?/p>
瀹夎濂絨uicklisp鍚庯紝灝卞彲浠ヤ嬌鐢ㄥ畠瀹夎寰堝Lisp杞歡/搴撲簡銆俼uicklisp鍦ㄥ畨瑁呬竴涓狶isp搴撴椂錛屼細鑷姩涓嬭澆騫跺畨瑁呬緷璧栧簱錛屽氨鍍廰pt-get涓鏍楓傚洜涓篹xt-blog騫舵湭鏀跺叆鍒皅uicklisp鐨勮蔣浠跺垪琛ㄩ噷錛屾墍浠xt-blog闇瑕佹墜鍔ㄥ畨瑁呫傞鍏堬紝鍦ㄦ湰鍦幫紙闈濾PS涓婏級鑾峰彇ext-blog婧愮爜: 涓婇潰鐨刧it鏄垜涓漢瀛樹笢瑗跨敤鐨勶紝鏆傛椂娌″皢ext-blog鍗曠嫭鏀劇疆銆傝繘鍏ュ埌ext-blog鐩綍銆傝鐩綍涓嬫湁鍑犱釜鏂逛究鐨勮剼鏈彲浠ョ敤浜庡崥瀹㈢鐞嗐傞鍏堝皢ext-blog鎵撳寘騫朵笂浼犲埌VPS涓婏紝渚嬪: 璇ヨ剼鏈細璋冪敤make-dist.sh灝唀xt-blog鍏ㄩ儴婧愮爜鎵撳寘錛岀劧鍚庝嬌鐢╯cp鎷瘋礉璇ユ枃浠跺強update-blog.sh鍒癡PS鎸囧畾鐨勭洰褰曢噷錛堣繖閲屾槸/home/test錛夛紝鐒跺悗ssh涓奦PS銆傛湡闂翠細涓ゆ杈撳叆VPS緋葷粺鐨勫瘑鐮併傜劧鍚庝互涓嬫搷浣滃皢鍦╒PS涓婂畬鎴愩?/p>
棣栧厛榪涘叆鍒板垰鎵嶆嫹璐濇枃浠剁殑鐩綍: 瑙e帇ext-blog.tar.gz: 鐒跺悗ext-blog琚В鍘嬪埌/home/test/dist鐩綍銆傝繘鍏ユ鐩綍榪愯SBCL: ext-blog鐩綍涓媎ep.lisp浼氫嬌鐢╭uicklisp瀹夎渚濊禆搴擄紝榪涘叆SBCL鍚庯紝杞藉叆璇ユ枃浠跺嵆鍙畨瑁呮墍鏈変緷璧栧簱錛岃繖鍙兘闇瑕佷竴鐐規椂闂? 鍦ㄦ病鏈夊叾浠栭棶棰樹笅錛屽彲浠ユ殏鏃墮鍑篠BCL瀹屾垚涓浜涘叾浠栧噯澶囧伐浣溿?/p>
ext-blog鍦ㄦ渶榪戠殑鐗堟湰涓姞鍏ヤ簡楠岃瘉鐮佺敓鎴愬姛鑳斤紝榪欓渶瑕佷竴涓猵cf瀛椾綋鏂囦歡銆傚洜涓哄瓧浣撴枃浠朵竴鑸緝澶э紝鎵浠pload-dist.sh鑴氭湰騫舵病鏈夊皢璇ュ瓧浣撴枃浠舵墦鍖咃紝鎵浠ヨ繖閲岄渶瑕佹墜鍔ㄥ鍒訛紝鍚屾牱鍦ㄦ湰鍦扮殑ext-blog鐩綍涓? 鍙﹀錛屽洜涓洪渶瑕佸皢Lisp瑙i噴鍣ㄦ斁緗湪緋葷粺鍚庡彴鎵ц錛岄伩鍏嶅叧鎺塖SH浼氳瘽鍚庣粓姝BCL榪涚▼錛屾墍浠ヨ繖閲岄渶瑕佷釜宸ュ叿gnu screen銆傚彲浠ヤ嬌鐢╝pt-get鏉ュ畨瑁? 鐒跺悗錛屼竴鍒囧氨OK浜嗐傚湪VPS涓婂彲浠ヤ嬌鐢╡xt-blog鐩綍涓嬬殑run-blog.sh鏉ヨ繍琛岃繖涓崥瀹紙棣栧厛紜畾VPS涓婄殑nginx寮鍚級: 璇ヨ剼鏈細浣跨敤screen鍦ㄥ悗鍙板紑鍚竴涓猄BCL榪涚▼錛屽茍鑷姩杞藉叆ext-blog錛岀劧鍚庡湪8000绔彛涓婂紑鍚疕TTP鏈嶅姟銆傝繖涓惎鍔ㄨ繃紼嬪彲鑳戒細浣跨敤鍑犲崄縐掔殑鏃墮棿錛岀洿鎺trl+z閫鍑簊creen錛岃繖騫朵笉緇堟SBCL銆備竴孌墊椂闂村悗渚垮彲鍦ㄦ祻瑙堝櫒閲屾祴璇曘?/p>
濡傛灉涓鍒囨甯革紝姝ゆ椂閫氳繃嫻忚鍣ㄨ闂綘鐨勭珯鐐規椂錛屼細琚噸瀹氬悜鍒頒竴涓崥瀹㈠垵濮嬪寲欏甸潰錛屽涓嬶細 涓婂浘涓垜鏄湪鏈満嫻嬭瘯鐨勶紝鎵浠ュ煙鍚嶆槸localhost錛屽笇鏈涗笉鑷充簬浜х敓璇В銆傚垵濮嬪寲浠呴渶杈撳叆鐢ㄦ埛鍚嶅拰瀵嗙爜鍗沖彲錛屼互鍚庡彲閫氳繃璇ョ敤鎴峰悕鍜屽瘑鐮佽繘鍏ュ崥瀹㈠悗鍙扮鐞嗛〉闈€傚畬鎴愯繖涓姝ュ悗錛屽氨鍙互榪涘叆鍗氬鍚庡彴綆$悊欏甸潰鍋氭洿澶氱殑璁劇疆錛屼緥濡傚崥瀹㈡爣棰樼瓑銆?/p>
ext-blog鐨勭鐞嗛〉闈嬌鐢ㄤ簡emlog鍗氬緋葷粺鐨凜SS鍙婂叾浠栬祫婧愶紝鍥犳鏈夊悓瀛﹁寰楃鐞嗛〉闈㈠緢闈㈢啛灝變笉濂囨簡銆俥xt-blog鎻愪緵鍦ㄧ嚎緙栬緫鍗氬鍔熻兘錛屽悓鏃朵篃鏀寔綆鍗曠殑metaweblog API錛屽洜姝ゅ彲浠ヤ嬌鐢ㄤ竴浜涘崥瀹㈠鎴風鏉ュ彂琛ㄦ枃绔狅紙浠呮祴榪囨垜鑷繁鍐欑殑鍗氬瀹㈡埛绔痗l-writer錛夈?/p>
鏈枃鎻忚堪杈冧負綺楃暐錛屼富瑕佹槸寰堝緇嗚妭鎴戣嚜宸變篃璁頒笉娓呫傚鏈夐棶棰樺彲浠ュ彂閭歡緇欐垜銆?/p> ext-blog鏄竴涓嬌鐢–ommon Lisp緙栧啓鐨勫崥瀹㈢郴緇熴傚熀浜庝箣鍓嶅熀浜巒uclblog淇敼鐨勭粡楠岋紝鏂扮殑ext-blog鏈澶х▼搴﹀湴灝嗗崥瀹㈡湰韜殑閫昏緫涓庡墠鍙版覆鏌撳垎紱誨紑錛屽茍涓旀坊鍔犱簡瀵逛富棰?(theme)鐨勬敮鎸併傚埗浣滄柊鐨勪富棰樺彲浠ラ殢渚挎壘涓涓猈ordPress鐨勪富棰橈紝鐒跺悗灝唒hp浠g爜緲昏瘧鎴怢isp浠g爜鍗沖彲銆?/p>
ext-blog搴曞眰浠g爜闈炲父灝戯紝鍏跺疄鍩烘湰鐨勫崥瀹㈢郴緇熷姛鑳芥湰鏉ュ氨涓嶅銆傚ぇ閮ㄥ垎鍔熻兘閮芥槸鍦?鏈堝垵瀹屾垚銆傞偅涓椂鍊欏叕鍙告瘡澶╁姞鐝紝涓嬬彮鍥炲幓鍚庤繕鍐欑偣Lisp浠g爜銆傚悗鏉ヨ秺鏁磋秺绱紝灝卞疄鍦ㄦ病閭e畬鍠勫畠鐨勫績鎯咃紝涓鎷栧氨鎷栧埌7鏈堝簳錛屽姛鑳介兘榪樹笉綆楀畬鍠勶紙鑷沖皯榪樺緱鍔犱釜rss瀵煎嚭鍚э紵錛夈?/p>
ext-blog涓昏鏈夊嚑涓〉闈㈡淳鍙戯紝瀵規瘡涓〉闈㈤兘媧懼彂緇欏叿浣撶殑涓婚妯″潡錛岃鍏跺畬鎴愭覆鏌撱傜紪鍐欎竴涓富棰樻湰璐ㄤ笂灝辨槸鐢熸垚html欏甸潰銆傚湪Lisp鐨勪笘鐣屼腑鏈夊緢澶氬簱鍙互鐢熸垚html銆俥xt-blog鐨勪富棰樹篃涓嶉檺鍒朵綘浣跨敤鍝竴涓猦tml鐢熸垚搴撱傜洰鍓嶆垜鑷繁縐繪鐨?涓猈ordPress涓婚錛屼嬌鐢ㄧ殑閮芥槸google鐨刢losure-template鐨凩isp縐繪鐗堟湰錛屽嵆cl-closure-template銆俢losure-template浼氫粠妯℃澘浜х敓鍑?Lisp鍑芥暟錛岃繖涓鐐規槸姣斿悓綾誨簱涓殑html-template鏂逛究涓鐐廣傚綋鐒訛紝浣滀負涓涓ā鏉胯璦錛屽唴緗垽鏂佸驚鐜垯鏄繀欏葷殑銆?/p>
涓栫晫涓婂緢澶氭祦琛岀殑璇█閮芥湁嫻佽鐨刉eb寮鍙戞鏋躲侺isp鏂歸潰錛屾垜鏈寮濮嬮夌敤鐨勬槸Weblocks錛屾垜鐢氳嚦鐢ㄥ畠涓哄叕鍙稿啓浜嗕釜綆鍗曠殑璁㈤緋葷粺錛堣繖璁╀竴涓▼搴忓憳棰囨湁鑷豹鎰燂級銆備絾緇堢┒瑙夊緱Weblocks澶毦鐢紝澶嶆潅錛屼絾娌℃湁瀹為檯鍔熻兘銆傛垜鐢氳嚦闃呰浜嗗畠80%鐨勬簮浠g爜錛屼絾渚濈劧鑾峰彇涓嶅埌濡備綍鏇村ソ浣跨敤瀹冪殑鎬濇兂銆傜劧鍚庢伆濂芥垜鐪嬩簡浜汻ails渚嬪瓙錛岃櫧鐒舵垜涓嶆噦Ruby璇█錛堜緷鐒跺彲浠ョ湅鍒板緢澶氳璦鐗規ф湁Lisp鐨勫獎瀛愶級錛屼絾鐪嬫噦渚嬪瓙榪樹笉鏄ぇ闂銆傚悗鏉ユ垜鍐沖畾鑷繁鍐欎釜 Web妗嗘灦錛屽洜涓哄叾瀹炴垜涓昏闇瑕佺殑灝辨槸涓涓猽rl媧懼彂(route)錛屽氨鍍廟ails閭f牱銆傛垜鐢氳嚦涓烘鍋氫簡浜涜緇嗚璁★紝緇撴灉鍚庢潵涓嶅垢鍙戠幇Lisp閲屽凡緇忔湁涓涓被浼肩殑妗嗘灦浜嗭紝榪欏氨鏄疪estas銆俥xt-blog鍩轟簬Restas銆?/p>
鍚庡彴綆$悊榪欎笢瑗垮叾瀹炲彲瑕佸彲涓嶈銆傚氨綆楁病鏈夊悗鍙扮鐞嗭紝涔熷彲浠ラ氳繃澧炲己RPC鏉ュ疄鐜般備絾騫朵笉鏄瘡涓漢閮芥槸Lisper錛岀浉淇℃兂浜嗚Вext-blog鐨勪漢寰堝ぇ涓閮ㄥ垎閮芥槸鎯沖涔燣isp鐨勪漢銆傜患鍚堟潵鐪嬶紝鎷ユ湁涓涓悗鍙扮鐞嗗姛鑳斤紝鎻愪緵鏇村弸濂界殑鎿嶄綔鐣岄潰錛屼篃鏄潪甯告湁蹇呰鐨勩備絾鎴戠‘瀹炰笉鎿呴暱鍋氬墠鍙扮編鍖栫殑宸ヤ綔銆傚垢榪愬湴鏄垜灝嗘覆鏌撳拰閫昏緫鍒嗙寮浜嗭紝鍚庡彴綆$悊涔熺畻鏄富棰樼殑涓縐嶃傜劧鍚庯紝鎴戞妱浜唀mlog鍗氬緋葷粺鐨勫悗鍙扮鐞嗭紝濡傚墠鎵璇達紝涔熷氨鏄妸php浠g爜錛堣櫧鐒舵垜涔熶笉鎳俻hp錛夌炕璇戞垚lisp浠g爜銆?/p>
ext-blog鏄畬鍏ㄦ湁鐞嗙敱鍙戝竷鍒癱ommon-lisp.net涓婄殑錛岀敋鑷寵繕鍙互鍔犲叆鍒皅uicklisp鐨勫簱鍒楄〃閲屻備絾鍓嶆彁鏄帓闄ゅ敖鍙兘澶氱殑 bug錛屽啓涓緋誨垪鑻辨枃鏂囨。錛屼互鍙婃渶閲嶈鐨勶紝瀵瑰叾榪涜闀挎湡緇存姢銆備笉騫哥殑鏄垜鐩墠娌℃湁榪欎釜鏃墮棿鍜岀簿鍔涖傛墍浠ワ紝鍙兘鏆傛椂鍦ㄨ繖閲屽彂甯冧笅浜嗐?/p> 瑕佸洿瑙傛晥鏋滅殑璇風Щ姝ヨ嚦鎴戠殑鐙珛鍗氬錛?a title="http://codemacro.com" >http://codemacro.com銆傚叧浜巈xt-blog鏇存寮忕殑浠嬬粛璇風Щ姝ユ綃囷細http://codemacro.com/view/8銆?/p> ps錛屼箣鍓嶈闃呮垜鐙珛鍗氬鐨凾X楹葷儲鏇存崲涓媟ss鍦板潃錛?a title="http://codemacro.com/feed" >http://codemacro.com/feed錛岃屽崥瀹富欏典篃鏈濂芥崲鎴?a title="http://codemacro.com" >http://codemacro.com銆?/p> Tip 本文简要介绍了如何使用Lisp实现一个简单的RSS阅读器,对Lisp无兴趣的TX可以
只对RSS阅读器的实现思路稍作了解即可。 RSS Reader的实现并不像它看上去那么复杂。当初在决定写这个作为Lisp练习时,甚至觉得
没有多少内容可做。其简单程度甚至用不了你启动一个慢速IDE的时间:D。对Lisp无兴趣的
TX只需要读完这一节即可, RSS在实现上,可以说是XML的又一次扩张式的应用。因为RSS最重要的东西就是一个XML文件
。RSS主要用于Web中的内容同步。例如我们写的博客,门户网站的新闻,都是内容。Web服
务器将这些内容组织成XML,然后我们通过一个客户端来解析这些XML,就可以在不用直接访
问网站的情况下获取信息: RSS阅读器就是这样一个从Web服务器通过RSS(表现形式为XML)来获取信息内容的工具。它
可以被实现为一个独立的客户端程序,也可以实现为像Google Reader这种网页形式。后者
其核心功能其实是Google服务器在做,取得信息后再发给用户。 上已提及,RSS的实现其实就是个XML文件。这个XML文件格式非常简单,例如: 我们身边到处都是RSS文件,例如 http://m.shnenglu.com/rss.aspx 。RSS文件的框架大
致为: 对,其框架就是这样,一个channel节点,其下若干个item节点。举例来说, CPPBLOG首页就
是一个channel,该channel下有若干原创文章,每篇文章就是一个item。 无论是channel
,还是item,都会有很多属性,例如title/description/link,有些属性是RSS规范里要求
必须有的,有的是可选的。 那么,服务器和客户端是如何交互的呢?首先,服务器上的程序针对其某个页面,生成对应
的RSS文件。这个RSS文件基本上是有固定的URL的。客户端每次获取内容时,就从这个固定
的URL获取这个RSS文件。客户端获取到这个RSS文件后,解析之,再呈现给用户。这就是整
个过程。这个过程中客户端与服务器的交互,全部是正常的HTTP请求。 而RSS阅读器,如果做得足够简单,则只需要从指定的地方获取到RSS文件,然后解析这个
XML文件,然后以相对友好的形式显示即可。 虽然RSS阅读器在核心功能上很简单,但是作为一个可以使用的工具,依然有很多功能点需
要实现。基本功能包括: 我们还可以做很多扩展,例如Google Reader之类的在线RSS阅读器。这些阅读器的RSS抓取
功能做在服务器端,它们除了上面提到的基础功能外,还会包含内容分类,给内容打一些
标签,分析用户的订阅习惯然后推荐类似的内容等等。 本节描述在Lisp中实现上文的内容。主要包括: 通过HTTP请求获取到RSS文件、解析RSS文件
。 Lisp虽然历史悠久,但其扩展库标准却做得很拙劣。偏应用级的扩展库要么由编译器实现提
供,要么就得自己在网上找。一方面使用者希望库使用起来方便,另一方面库开发者在跨编
译器实现方面也头疼不已。所幸现在有了quick lisp,安装第三方库就像Ubuntu里安装软件
一样简单(大部分)。 socket支持就是面临的第一个问题。不过我这里并不考虑跨编译器实现的问题,直接使用
SBCL里的socket接口。 要获取RSS文件,只需要连接Web服务器,发起HTTP的GET请求即可。当然,建立TCP连接,组
建HTTP请求包,就不是这里的讨论了。我们还是拿CPPBLOG首页的RSS为例,该RSS的URL为: 拆分一下,得到host为m.shnenglu.com(即我们要connect的地址),rss的uri为
/rss.aspx(即HTTP请求里的文件URI),于是建立HTTP请求包: 关于HTTP请求的一些基础知识,可以参考我很早前写的一篇博客:<实现自己的http服务器>。
正常情况下,Web服务器就会返回RSS的文件内容。然后我们就可以继续解析。 RSS本身是一个XML格式的文件。之前连接Web服务器发起HTTP请求没有用到第三方库,但是
解析XML文件不是几十来行代码能搞定的事情,所以这里需要选用一个第三方库。 我用的是s-xml,这个库在我之前的 关于Lisp的文章 中提到过。s-xml与我之前在C++
领域见到的XML解析库最大的不同点在于,它提供的API是基于事件模式的。意思是说,你不
要去查询某个element的值是多少,当我解析到的时候会告诉你。事件模式的编程方式自然
离不开回调函数: 与s-xml交互的也就是上面代码里提到的三个函数:new-element-hook, finish-element-hook
, text-hook。这种类型的接口导致解析代码大量减少,但不利于理解。我们要在整个解析
过程中传递数据,需要通过与s-xml交互的函数参数(当然不会蠢到去用全局变量)。 解析过程中通过往函数参数指定的对象身上塞数据完成,整个解析实现也就几十行代码。
文章尾可下载代码看看。 通过上面两步,我们得到了RSS文件、解析出了具体内容,最后一步就是呈现出来看看。RSS
文件里每个Item都是一篇文章(新闻之类),这个文章内容可直接包含HTML标记,说白了,
这些内容就是直接的HTML内容。要显示这些内容,最简单的方法就是把一个RSS转换成一种
简单的HTML文件,以供阅读。 这里就涉及到HTML generator,几乎所有的Lisper都会写一个HTML产生器(库)(虽然目前
我还没写)。这种库的作用就是方便地输出HTML文件。 Lisp相对于其他语言很大的一个特点,或者说是优点,就是其语言本身的扩展能力。这种扩
展不是简单的添加几个函数,也不是类,而是提供一些就像语言本身提供的特殊操作符一样
的东西。而HTML generator正是这种东西大放异彩的地方。这种感觉有点像在C++中通过模
板造出各种增强语言特性的东西一样(例如boost/loki)。 因为我这里只是输出简单的HTML文件,何况我对HTML的标记了解的也不多,也懒得再花经历
。所以我暂时也就将就了些土方法: 最后组合一些接口,即可将整个过程联系起来,导出html文件: 然后在浏览器里查看,如图: ;;EOF;; Note 鏈枃鎻忚堪鐨凩isp涓昏鎸嘗isp鐨勬柟璦Common Lisp銆?/p>
鍙橀噺錛屾槸鎵鏈夌紪紼嬭璦閲岄兘鏈夌殑璇硶姒傚康銆傚湪C/C++涓紝鍙橀噺鐢ㄤ簬鏍囩ず涓涓唴瀛樺湴鍧錛岃屽彉
閲忓悕鍒欏湪璇硶灞傞潰涓婁唬琛ㄨ繖涓湴鍧銆傚綋閾炬帴鍣ㄦ渶緇堥摼鎺ユ垜浠殑紼嬪簭鏃訛紝灝卞皢榪欎簺鍚嶅瓧鏇挎崲
涓哄疄闄呯殑鍦板潃銆傚湪鍏朵粬璇█涓紝鍙橀噺铏界劧鎴栧鎴栧皯鏈夊叾浠栦笉鍚岀殑鍚箟錛屼絾涔熷ぇ鑷村姝ゃ?/p>
Lisp涓殑鍙橀噺涔熷樊涓嶅榪欐牱錛屼絾鑻ュ皢variable鍜孡isp涓殑 symbol 鏀懼湪涓璧鳳紝鍒欏灝戜細
甯︽潵浜涘洶鎯戙?/p>
寰堝鏁欐巿Lisp鐨勪功涓紝澶ф浼氱畝鍗曞湴鍛婅瘔鎴戜滑鍙互浣跨敤濡備笅鐨勬柟寮忓畾涔変竴涓叏灞鍙橀噺 [1]. 濡備笂浠g爜錛屾垜浠究瀹氫箟浜嗕竴涓叏灞鍙橀噺 *var*[2] 錛屽畠琚垵濮嬪寲涓烘暟鍊?銆傚悓鏍鳳紝鎴戜滑
榪樺彲浠ヤ嬌鐢ㄥ彟涓縐嶅熀鏈浉鍚岀殑鏂瑰紡: 闄や簡鍏ㄥ眬鍙橀噺錛屾垜浠繕鍙互瀹氫箟灞閮ㄥ彉閲忋備絾灞閮ㄥ彉閲忕殑瀹氫箟紼嶆樉楹葷儲錛堝嵈鍙兘鏄彟涓縐?
璁捐鑰冭檻錛夈傚畾涔夊眬閮ㄥ彉閲忛渶瑕佷嬌鐢ㄤ竴浜涘畯錛屾垨鑰呯壒孌婅繍綆楃錛屼緥濡? 濂戒簡錛屽氨榪欎簺浜嗐侺isp涓叧浜庡彉閲忕殑緇嗚妭錛屼篃灝辮繖浜涖備綘鐢氳嚦鑳界敤浣犲湪C/C++涓殑緇忛獙鏉ョ
鎺竴鍒囥備絾鏄紝鎴戜滑寰堝揩灝辯湅鍒頒簡寰堝鍥版儜鐨勫湴鏂廣?/p>
鎴戦亣鍒扮殑絎竴涓洶鎯戠殑鍦版柟鏉ユ簮浜庡嚱鏁幫紝閭d箞絳夋垜璁茶鍑芥暟鍐嶆潵鍒嗕韓涓嬪潕鍧楓?/p>
Lisp涓殑鍑芥暟緇濆涓嶅鏉傦紝浣犵粷瀵逛笉鐢ㄦ媴蹇冩垜鍦ㄥ拷鎮犱綘 [3] 銆備綔涓轟竴闂ㄥ嚱鏁板紡璇█錛屽叾棣栬
浠誨姟灝辨槸鍔犲己鍑芥暟榪欎釜涓滆タ鍦ㄦ暣涓璦閲岀殑鍔熻兘銆傚鏋滀綘鍠滄騫塊槄鍚勭涓庝綘宸ヤ綔涓嶇浉騫茬殑
鎶鏈紝浣犺偗瀹氬凡緇忓寰堝鍑芥暟寮忚璦涓栫晫涓殑姒傚康鐣ユ湁鑰抽椈銆備緥濡傞棴鍖咃紝浠ュ強first class
type [4] 銆?/p>
Lisp涓殑鍑芥暟灝辨槸first class type銆傝繖浠涔堟剰鎬濆憿錛熺洿鐧芥潵璇達紝 Lisp涓殑鍑芥暟鍜屽彉閲?
娌′粈涔堝尯鍒紝浜湁鍚岀瓑寰呴亣 銆傝繘涓姝ユ潵璇達紝鍙橀噺fn鐨勫煎彲浠ユ槸鏁板?錛屼篃鍙互鏄瓧絎︿覆
"hello"錛岀敋鑷蟲槸鏌愪釜鍑芥暟銆傝繖鍏跺疄灝辨槸C++紼嬪簭鍛樿鐨刦unctor銆?/p>
Lisp涓畾涔夊嚱鏁伴潪甯哥畝鍗? 榪欐牱錛屾垜浠氨瀹氫箟浜嗕竴涓悕涓篴dd2錛屾湁1涓弬鏁幫紝1涓繑鍥炲肩殑鍑芥暟銆傝璋冪敤璇ュ嚱鏁版椂錛屽彧闇
瑕?(add2 2) 鍗沖彲銆傝繖綆鐩村拰鎴戜滑鍦↙isp涓畬鎴愪竴涓姞娉曚竴妯′竴鏍?(+ 2 3) Lisp浣滀負涓闂ㄥ嚱鏁板紡璇█錛屽叾鍑芥暟涔熻兘浣滀負鍙︿竴涓嚱鏁扮殑鍙傛暟鍜岃繑鍥炲?[5] apply-fn鍑芥暟絎竴涓弬鏁版槸涓涓嚱鏁幫紝瀹冧嬌鐢╢uncall鍑芥暟闂存帴鍦拌皟鐢╢n鎸囧悜鐨勫嚱鏁般備綔涓?
涓涓狢++紼嬪簭鍛橈紝榪欑畝鐩村お濂界悊瑙d簡錛岃繖瀹屽叏灝辨槸涓涓嚱鏁版寚閽堢殑璇硶緋栧槢銆備簬鏄紝鍋囪鎴?
浠浣跨敤apply-fn鏉ラ棿鎺ヨ皟鐢╝dd2鍑芥暟: 鍙槸榪欐槸涓嶅鐨勩傛垜浠渶瑕侀氳繃鍙︿竴涓壒孌婃搷浣滅鏉ュ畬鎴愯繖浠朵簨: #'鎿嶄綔絎︾敤浜庡皢add2瀵瑰簲鐨勫嚱鏁板彇鍑烘潵錛岃繖涔堣褰撶劧涓嶅ぇ鍑嗙‘銆侫gain錛屼綔涓轟竴涓狢++紼嬪簭鍛?
錛岃繖綆鐩村氨鏄釜鍙栧湴鍧鎿嶄綔絎?amp;鐨勮娉曠硸鍢涖傚ソ鍚э紝榪欎箞鐞嗚В璧鋒潵浼間箮娌¢棶棰樹簡銆?/p>
Lisp涓兘鐢氳嚦鑳藉湪浠諱綍鍦版柟瀹氫箟涓涓嚱鏁幫紝渚嬪鎴戜滑鍒涘緩涓涓嚱鏁幫紝璇ュ嚱鏁拌繑鍥炲垱寤哄嚭鏉ョ殑
鍑芥暟錛岃繖鏄竴涓吀鍨嬬殑璁茶В浠涔堟槸 闂寘 鐨勪緥瀛? 鏃犺濡備綍錛実et-add-n鍑芥暟榪斿洖涓涓嚱鏁幫紝璇ュ嚱鏁版槸add2鍑芥暟鐨勬硾鍨嬪疄鐜般傚畠鍙互灝嗕綘浼犲叆
鐨勫弬鏁板姞涓妌銆傝繖浜涗唬鐮侀噷浣跨敤浜唋ambda琛ㄨ揪寮忋俵ambda琛ㄨ揪寮忕洿鐧芥潵璇達紝灝辨槸鍒涘緩涓涓瓧
闈笂鐨勫嚱鏁般傝繖鍙堟槸浠涔堟剰鎬濆憿錛熷氨鍍忔垜浠湪浠g爜涓啓鍑?錛屽啓鍑?hello"涓鏍鳳紝2灝辨槸涓瓧
闈笂鐨勬暟瀛楋紝"hello"灝辨槸涓瓧闈笂鐨勫瓧絎︿覆 [6] 銆?/p>
閭d箞錛屾昏岃█涔嬶紝閫氳繃lambda鍒涘緩涓涓嚱鏁頒綋錛岀劧鍚庨氳繃#'鎿嶄綔絎﹀嵆鍙緱鍒頒竴涓嚱鏁幫紝铏界劧
娌℃湁鍚嶅瓧銆傛湁浜嗕互涓婄煡璇嗗悗錛孉gain and again錛屼綔涓轟竴涓狢++紼嬪簭鍛橈紝寰堝揩鎴戜滑灝辮兘寰楀埌涓
涓▼搴忥細瀹氫箟鍙橀噺錛岀敤鍙橀噺鍘諱繚瀛樹竴涓嚱鏁幫紝鐒跺悗閫氳繃榪欎釜鍙橀噺鏉ヨ皟鐢ㄨ繖涓嚱鏁般傝繖鏄涔?
澶╃粡鍦頒箟鐨勪簨錛屽氨鍍忎箣鍓嶉偅涓氳繃鍙傛暟璋冪敤鍏舵寚鍚戠殑鍑芥暟涓鏍? 榪欐牱鐨勪唬鐮佹槸涓嶅鐨勶紝閿欒鍙戠敓浜庣浜岃錛屾棤璁轟綘浣跨敤鐨凩isp瀹炵幇鏄摢縐嶏紝澶ф浼氬緱鍒板涓?
鐨勯敊璇俊鎭? 鑰佸疄璇達紝榪欏凡緇忕畻鏄涔堟湁榪瑰彲寰殑閿欒鎻愮ず浜嗗晩銆傚皢浠ヤ笂浠g爜鍜屼箣鍓嶇殑apply-fn瀵規瘮錛屾槸
澶氫箞寰楃浼煎晩錛屽彲鎯滃氨鏄敊鐨勩傝繖鏄垜浠亣鍒扮殑絎竴涓悊瑙e亸宸鑷寸殑闂銆傚鏋滀綘榪樹笉娣?
鍏ユ帰絀訛紝浣犲皢浼氬湪榪欎竴鍧楅亣鍒版洿澶氶夯鐑︺傚強鏃跺湴鎷垮嚭浣犵殑鍕囨皵錛屾姭鑽嗘柀媯橈紝鍒ㄦ牴絀跺簳錛岀粷瀵?
鏄涔犵紪紼嬬殑濂藉搧璐ㄣ?/p>
涓婃枃涓彁鍒扮殑鍙橀噺鍑芥暟涔嬬被錛屼箣鎵浠ヤ細鍦ㄦ煇浜涙椂鍊欎笌鎴戜滑鐨勭悊瑙e彂鐢熷亸宸紝騫朵笖鎬繪槸瀛樺湪浜?
紲炵鐨勫湴鏂規棤娉曡В閲娿傝繖瀹屽叏鏄洜涓烘垜浠悊瑙e緱澶墖闈㈠鑷淬侺isp涓殑Symbol鍙互璇村氨鏄煇
涓彉閲忥紝鎴栬呮煇涓嚱鏁幫紝浣嗚繖澶墖闈€侺isp涓殑Symbol鎷ユ湁鏇翠赴瀵岀殑鍚箟銆?/p>
灝卞儚寰堝璇█鐨勫彉閲忋佸嚱鏁板悕涓鏍鳳紝Lisp涓殑Symbol姣斿叾浠栬璦鍦ㄥ懡鍚嶆柟闈㈡洿鑷敱錛?鍙?
瑕佷綅浜?|'瀛楃涔嬮棿鐨勫瓧絎︿覆錛屽氨琛ㄧず涓涓悎娉曠殑Symbol鍚嶃?/strong> 鎴戜滑鍙互浣跨敤鍑芥暟
symbol-name鏉ヨ幏鍙栦竴涓猄ymbol鐨勫悕瀛楋紝渚嬪: '(quote)鎿嶄綔絎﹀憡璇塋isp涓嶈瀵瑰叾淇グ鐨勪笢瑗胯繘琛屾眰鍊?evaluate)銆備絾鍋囧娌℃湁榪欎釜鎿嶄綔絎?
浼氭庢牱鍛紵鍚庨潰鎴戜滑灝嗙湅鍒頒細鎬庢牱銆?/p>
<ANSI Common Lisp>涓涔︿腑鏈夊彞璇濈湡姝e湴鎻ず浜哠ymbol鐨勬湰璐細 Symbols are real
objects 銆傛槸鐨勶紝Symbols鏄璞★紝榪欎釜瀵硅薄灝卞儚鎴戜滑鐞嗚В鐨凜++涓殑瀵硅薄涓鏍鳳紝瀹冩槸涓涓?
澶嶅悎鐨勬暟鎹粨鏋勩傝鏁版嵁緇撴瀯閲屽寘鍚嫢騫插煙錛屾垨鑰呴氫織鑰岃█錛氭暟鎹垚鍛樸傚熺敤<ANSI Common
Lisp>涓殑涓鍥撅細 閫氳繃榪欏箙鍥撅紝鍙互鎻紑鎵鏈夎皽搴曘備竴涓猄ymbol鍖呭惈鑷沖皯鍥句腑鐨勫嚑涓煙錛屼緥濡侼ame銆乂alue銆?
Function絳夈傚湪Lisp涓湁寰堝鍑芥暟鏉ヨ闂繖浜涘煙錛屼緥濡備笂鏂囦腑浣跨敤鍒扮殑symbol-name錛岃繖涓?
鍑芥暟鏈川涓婂氨鏄彇鍑轟竴涓猄ymbol鐨凬ame鍩熴?/p>
鑷劧鑰岀劧鍦幫紝緲婚槄Lisp鏂囨。錛屾垜浠細鍙戠幇鏋滅劧榪樻湁鍏朵粬鍑芥暟鏉ヨ闂甋ymbol鐨勫叾浠栧煙錛屼緥濡? 浣嗘槸榪欎簺鍙堜笌涓婃枃鎻愬埌鐨勫彉閲忓拰鍑芥暟鏈変粈涔堣仈緋誨憿錛熺湡鐩稿彧鏈変竴涓紝 鍙橀噺銆佸嚱鏁扮矖鐣ユ潵
璇村氨鏄疭ymbol鐨勪竴涓煙錛屼竴涓垚鍛樸傚彉閲忓搴擵alue鍩燂紝鍑芥暟瀵瑰簲Function鍩熴備竴涓猄ymbol
榪欎簺鍩熸湁鏁版嵁浜嗭紝鎴戜滑璇村畠浠彂鐢熶簡緇戝畾(bind)銆?/strong> 鑰屾伆濂斤紝鎴戜滑鏈夊嚑涓嚱鏁板彲浠ョ敤浜庡垽
瀹氳繖浜涘煙鏄惁琚粦瀹氫簡鍊? 閫氳繃涓浜涗唬鐮佹潵鍥炲懗浠ヤ笂緇撹: 涓婇潰鐨勪唬鐮佺畝鐩存彮縐樹簡鑻ュ共鎯婂ぉ鍦版常楝肩鐨勭湡鐩搞傞鍏堬紝鎴戜滑浣跨敤鎴戜滑鐔熺煡鐨刣efvar瀹氫箟浜?
涓涓悕涓?*var* 鐨勫彉閲忥紝鍒濆間負1錛岀劧鍚庝嬌鐢╞oundp鍘誨垽瀹?*var* 鐨刅alue鍩熸槸鍚?
鍙戠敓浜嗙粦瀹氥傝繖鍏跺疄鏄錛?鍘熸潵瀹氫箟鍙橀噺灝辨槸瀹氫箟浜嗕竴涓猄ymbol錛岀粰鍙橀噺璧嬪鹼紝鍘熸潵灝?
鏄粰Symbol鐨刅alue鍩熻祴鍊鹼紒 鍏跺疄錛孡isp涓墍鏈夎繖浜涚鍙鳳紝閮芥槸Symbol銆?/strong> 浠涔堝彉閲忥紝浠涔堝嚱鏁幫紝閮芥槸嫻簯銆備笂闈㈢殑
渚嬪瓙涓紝绱ф帴鐫鐢╢boundp鍒ゆ柇Symbol *var* 鐨凢unction鍩熸槸鍚︾粦瀹氾紝榪欎釜鏃跺欎負鍋囥?
鐒跺悗鎴戜滑瀹氫箟浜嗕竴涓悕涓?*var* 鐨勫嚱鏁幫紝涔嬪悗鍐嶅垽鏂紝鍒欏凡鐒朵負鐪熴傝繖涔熸槸涓轟粈涔堬紝
鍦↙isp涓煇涓嚱鏁板彲浠ュ拰鏌愪釜鍙橀噺鍚屽悕鐨勫師鍥犳墍鍦ㄣ?/strong> 浠庤繖孌典唬鐮佷腑鎴戜滑涔熷彲浠ョ湅鍑?
defvar/defun榪欎簺鎿嶄綔絎︺佸畯鎵鍋氫簨鎯呯殑鏈川銆?/p>
浜嬫儏灝辮繖鏍風粨鏉熶簡錛烵f course not銆傝繕鏈夊緢澶氫笂鏂囨彁鍒扮殑鐤戞儜娌℃湁瑙e喅銆傞鍏堬紝Symbol鏄?
濡傛澶嶆潅錛岄偅涔圠isp濡備綍鍐沖畾瀹冨湪涓嶅悓鐜涓嬬殑鍚箟鍛紵Symbol铏界劧鏄釜瀵硅薄錛屼絾瀹冨茍涓嶅儚
C++涓殑瀵硅薄涓鏍鳳紝瀹冨嚭鐜版椂騫朵笉鎸囦唬鑷繁錛佷笉鍚屽簲鐢ㄧ幆澧冧笅錛屽畠鎸囦唬鐨勪笢瑗夸篃涓嶄竴鏍楓傝繖
浜涙寚浠d富瑕佸寘鎷彉閲忓拰鍑芥暟錛屾剰鎬濇槸璇達細 Symbol鍑虹幇鏃訛紝瑕佷箞鎸囩殑鏄畠鐨刅alue錛岃涔堟槸
瀹冪殑Function銆?/strong> 榪欑鑳屽湴閲屽共鐨勪簨鎯咃紝涔熺畻鏄犳垚榪鋒儜鐨勪竴涓師鍥犮?/p>
褰撲竴涓猄ymbol鍑虹幇鍦ㄤ竴涓狶ist鐨勭涓涓厓绱犳椂錛屽畠琚鐞嗕負鍑芥暟銆傝繖涔堣鏈夌偣榪鋒儜浜猴紝鍥犱負
瀹冨甫榪涗簡Lisp涓唬鐮佸拰鏁版嵁涔嬮棿鐨勬ā緋婅竟鐣岀壒鎬с傜畝鍗曟潵璇達紝灝辨槸褰揝ymbol鍑虹幇鍦ㄤ竴涓嫭鍙?
琛ㄨ揪寮?s-expression)涓涓涓綅緗椂錛岀畻鏄釜鍑芥暟錛屼緥濡? 闄ゆ涔嬪錛屾垜鑳芥兂鍒扮殑鍏朵粬澶ч儴鍒嗘儏鍐碉紝涓涓猄ymbol閮借鎸囦唬涓哄畠鐨刅alue鍩燂紝涔熷氨鏄褰?
浣滃彉閲忥紝渚嬪: 榪欑湅璧鋒潵鏄涔堝彜鎬殑浠g爜銆備絾鏄繍鐢ㄦ垜浠笂闈㈣鐨勭粨璁猴紝渚垮彲杞繪槗瑙i噴錛氳〃杈懼紡涓涓涓?
*var* 琚綋浣滃嚱鏁板鐞嗭紝瀹冮渶瑕佷竴涓弬鏁幫紱琛ㄨ揪寮忕浜岄儴鍒嗙殑 *var* 琚綋浣滃彉閲?
澶勭悊錛屽畠鐨勫間負1錛岀劧鍚庡皢鍏朵綔涓哄弬鏁頒紶鍏ャ?/p>
鍐嶆潵璇磋'(quote)鎿嶄綔絎︼紝榪欎釜鎿嶄綔絎︾敤浜庨槻姝㈠叾鎿嶄綔鏁拌姹傚箋傝屽綋涓涓猄ymbol鍑虹幇鏃訛紝
瀹冩繪槸浼氳姹傚鹼紝鎵浠ワ紝鎴戜滑鍙互鍒嗘瀽浠ヤ笅浠g爜: 榪欎釜浠g爜騫朵笉姝g‘錛屽洜涓?*var* 鎬繪槸浼氳姹傚鹼紝灝卞儚 (*var* *var*) 涓鏍鳳紝絎簩
涓?*var* 琚眰鍊鹼紝寰楀埌鏁板瓧1銆傝繖閲屼篃浼氬彂鐢熻繖縐嶄簨鎯咃紝閭d箞鏈緇堝氨絳夊悓浜? 鎴戜滑璇曞浘鍘誨彇鏁板瓧1鐨刅alue鍩燂紝鑰屾暟瀛?騫朵笉鏄竴涓猄ymbol銆傛墍浠ワ紝鎴戜滑闇瑕乹uote榪愮畻絎? 榪欏彞浠g爜鏄錛屽彇Symbol *var* 鏈韓鐨刅alue鍩燂紒鑰屼笉鏄叾浠栦粈涔堝湴鏂廣傝嚦姝わ紝鎴戜滑
渚垮彲浠ュ垎鏋愪互涓嬪鏉傛儏鍐? 鐜板湪錛屾垜浠敋鑷寵兘瑙i噴涓婃枃鐣欎笅鐨勪竴涓棶棰? 緇檉n鐨刅alue璧嬪間竴涓嚱鏁幫紝 (fn 3) 褰撲竴涓猄ymbol浣滀負鍑芥暟浣跨敤鏃訛紝涔熷氨鏄彇鍏?
Function鍩熸潵鍋氳皟鐢ㄣ備絾鍏禙unction鍩熶粈涔堜篃娌℃湁錛屾垜浠瘯鍥懼皢涓涓猄ymbol鐨刅alue鍩熷綋浣?
Function鏉ヤ嬌鐢ㄣ傚浣曡В鍐寵繖涓棶棰橈紵鎯蟲兂錛宻ymbol-function鍙互鍙栧埌涓涓猄ymbol鐨?
Function鍩? 閫氳繃鏄劇ず鍦扮粰fn鐨凢unction鍩熻祴鍊鹼紝鑰屼笉鏄氳繃defvar闅愬紡鍦板鍏禫alue鍩熻祴鍊鹼紝灝卞彲浠ヤ嬌
(fn 3) 璋冪敤姝g‘銆傝繕鏈夊彟涓涓棶棰樹篃鑳借交鏄撹В閲? 鏈剰鏄兂浼犲叆add2榪欎釜Symbol鐨刦unction鍩燂紝浣嗘槸鐩存帴榪欐牱鍐欑殑璇濓紝浼犲叆鐨勫叾瀹炴槸add2鐨?
Value鍩?[7] 錛岃繖褰撶劧鏄笉姝g‘鐨勩傚姣旀紜殑鍐欐硶錛屾垜浠敋鑷寵兘鐚滄祴#'榪愮畻絎﹀氨鏄竴涓?
鍙朣ymbol鐨凢unction鍩熺殑榪愮畻絎︺傝繘涓姝ワ紝鎴戜滑榪樺彲浠ョ粰鍑哄彟涓縐嶅啓娉? 娣卞叆鐞嗚В浜嬫儏鐨勮儗鍚庯紝浣犱細鍙戠幇浣犺兘鍐欏嚭澶氫箞鐏墊椿鐨勪唬鐮併?/p>
鍏充簬Symbol鐨勫唴瀹硅繕鏈夋洿澶氾紝渚嬪Package銆傛紜悊瑙h繖浜涘唴瀹逛互鍙婁粬浠箣闂寸殑鍏崇郴錛屾湁鍔?
浜庢洿娣卞埢鍦扮悊瑙isp銆?/p>
鏈榪戜竴鐩村湪瀛︿範Lisp榪欓棬璇█銆傚洖澶翠竴鐪嬶紝鍩烘湰涓婃帴榪?涓湀浜嗐傚垰寮濮嬫帴瑙isp鏄洜涓虹湅
浜?lt;Lisp鏈川>錛岀劧鍚庢垜鍙戠幇鏈夊緢澶氫漢瀹楁暀鑸湴蹇犺瘹榪欓棬璇█錛屼簬鏄氨鏉ヤ簡鍏磋叮銆?/p>
褰撶劧騫朵笉鏄瘡嬈″洜涓烘煇綃囧啓寰楀緢geek鎶鏈枃绔犲氨鍘誨涔犳煇涓柊鐨勬妧鏈偣銆備竴涓湀鏃墮棿瀵規垜鏉?
璇磋繕鏄緢鐝嶈吹浜嗐備絾鏄疞isp緇濆鏄ぇ閮ㄥ垎紼嬪簭鍛橀兘鍊煎緱涓瀛︾殑璇█錛堝氨鍍廐askell涓鏍鳳級銆?
鎴戣兘緇欏嚭鐨勭畝鍗曠悊鐢卞寘鎷細 鍙︿竴鏂歸潰錛岀粨鍚堟垜涓涓湀浠ユ潵鐨勮涔﹀拰涓や釜緇冧範宸ョ▼鐨勫疄璺電粡鍘嗭紝鎴戣寰椾篃鏈変簺鐞嗙敱鍊煎緱浣?
涓嶅幓瀛︿範Lisp錛?/p>
榪欑瘒鍗氬鎴戜嬌鐢╮eStructuredText鏍煎紡緙栧啓錛岀劧鍚庣敤docutls瀵煎嚭涓篽tml錛屽啀鐒跺悗浣跨敤榪欏洖
鐢╨isp寮鍙戠殑鍩轟簬metaweblog API鐨勫崥瀹㈠鎴風錛岃嚜鍔ㄥ彂甯冨埌CPPBLOG銆?/p>
鎴戝氨鎽樺綍浜涗功涓婄殑瑙傜偣(鍘嗗彶)錛?/p>
鎴戝彲榪樻病鍒版妸Lisp鎹т笂澶╃殑鍦版銆傚鏋淟isp濡傛涔嬪ソ錛屼負浠涔堢敤鐨勪漢涓嶅錛?lt;Land Of Lisp>
閲屼綔鑰呮伆濂藉榪欎釜闂鍋氫簡鍥炵瓟(bla bla bla錛屾噿寰楃粏璇?銆?/p>
Lisp涓嶅儚鏈変簺璇█錛屾湁涓洿鎺ョ殑鏈烘瀯鏉ョ淮鎶ゃ傛劅瑙夊畠鏇村儚C/C++涓鏍鳳紝鍙湁涓爣鍑嗭紝鐒跺悗鏈?
鑻ュ共緙栬瘧鍣紙瑙i噴鍣級瀹炵幇銆侺isp鍦ㄥ嚑鍗佸勾鐨勫彂灞曚腑錛屼駭鐢熶簡寰堝縐嶆柟璦銆傛柟璦涔熷氨鏄艦鍙?
紲炰笉鍙樼殑璇█鍙樼錛屾湰鏂囪鐨凩isp鍧囨寚Lisp鐨勬柟璦Common Lisp銆傚彟涓涓瘮杈冩湁鍚嶇殑鏂硅█鏄?
Scheme錛屽叧浜庡悇涓柟璦鐨勭壒鐐癸紝<Land Of Lisp>閲屼篃緇欎簡涓涓浘鐗囷細 鍏朵腑錛屾渶宸﹁竟閭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>
鍍忔垜浠繖縐嶅熀鏈病鎺ヨЕ榪嘩eb寮鍙戠殑浜猴紝鍙兘瀹屽叏娌℃湁鎬濊礬鍘誨疄鐜頒竴涓崥瀹㈠鎴風銆備簨瀹炰笂
瀹炵幇璧鋒潵闈炲父綆鍗曘?/p>
浣跨敤榪囧叾浠栧崥瀹㈠鎴風錛堜緥濡俉indows Live writer錛夌殑浜鴻偗瀹氱煡閬搈etaweblog API錛屽湪閰?
緗鎴風鐨勬椂鍊欓渶瑕佸~鍏ャ備緥濡侰PPBLOG鐨勮繖涓湴鍧灝辨槸
http://m.shnenglu.com/kevinlynx/services/metaweblog.aspx銆傝繖涓〉闈㈠睍紺轟簡涓浜汚PI
璇存槑銆傝繖浜汚PI灝辨槸鍗氬瀹㈡埛绔拰鏈嶅姟鍣ㄨ繘琛屾搷浣滈氫俊鐨勬帴鍙c傛剰鎬濇槸璇達紝鏈嶅姟鍣ㄧ鎻愪緵榪?
榪欎簺鎺ュ彛錛屾垜浠殑瀹㈡埛绔皟鐢ㄨ繖浜涙帴鍙e嵆鍙備緥濡? 浣嗘槸瀹㈡埛绔浣曡皟鐢ㄥ埌榪欎釜鎺ュ彛鍛紵榪欓渶瑕侀氳繃涓縐嶆柊鐨勬妧鏈紙鎴栬呰鏍囧噯錛夛紝鍗?xml rpc
銆俽pc澶у搴旇娓呮錛寈ml rpc鍏跺疄璇寸櫧浜嗭紝 灝辨槸鎶婃帴鍙h皟鐢ㄧ殑緇嗗垯濉炶繘 http
璇鋒眰鍙戠粰web鏈嶅姟鍣紝鏈嶅姟鍣ㄦ帴鏀惰姹傚畬鎴愭搷浣滃悗鍐嶆妸緇撴灉浠ttp鍥炲簲鐨勫艦寮忎涪緇欏鎴風錛?
鍗沖畬鎴愪簡涓嬈℃帴鍙h皟鐢?/strong> 銆?/p>
鑷充簬http璇鋒眰鍥炲簲鐨勭粏鍒欏氨涓嶆彁浜嗭紝鏃犻潪灝辨槸涓浜涚壒孌婃牸寮忕殑鏁版嵁錛岄氳繃tcp榪炴帴涓庢湇鍔″櫒
浜や簰榪欎簺鏁版嵁銆?/p>
鎵浠ワ紝鍩烘湰涓婏紝鏁翠釜榪囩▼榪樻槸闈炲父綆鍗曘傚浣曟潵灝嗚皟鐢ㄧ粏鑺傚榪沨ttp璇鋒眰錛屽垯鏄互xml rpc
鏍囧噯鏉ュ仛錛屽叾鏍煎紡姝eソ鏄痻ml鏍煎紡銆備婦涓緥瀛愬惂: 褰撶劧榪欓儴鍒嗘暟鎹箣鍓嶅氨鏄嫢騫瞙ttp璇鋒眰鐨勬暟鎹傛湇鍔″櫒鍥炲簲涔熸槸浠ml鏍煎紡緇勭粐: 鎴戜滑鐨勫崥瀹㈠鎴風鎵瑕佸仛鐨勶紝灝辨槸鎶婅繖浜涘崥瀹㈠彂甯冪浉鍏崇殑鎿嶄綔灝佽璧鋒潵鎻愪緵緇欎嬌鐢ㄨ呫傚簳灞?
瀹炵幇涓昏鍖呮嫭http璇鋒眰銆亁ml-rpc鐨勭粍緇囩瓑銆備綍鍐碉紝榪欎袱閮ㄥ垎鍦ㄥ悇涓璦閲岄兘鏈夊ぇ閲忕殑搴撳瓨
鍦紝lisp鑷劧涔熸湁銆?/p>
鎴戣繖閲岀洿鎺ラ夊彇浜唋isp鐨勪竴涓獂ml-rpc搴擄細s-xml-rpc錛屽熀鏈笂鐧炬潵琛屼唬鐮佸氨鍙互鎶婂悇涓姛
鑳借窇涓閬嶃備緥濡備互涓媗isp浠g爜灝卞疄鐜頒簡閫氳繃s-xml-rpc鍒犻櫎CPPBLOG鐨勪竴綃囨枃绔? 鍙戝竷鍗氬涔熷緢綆鍗曪紝鏍規嵁metaweblog API鎺ュ彛鐨勮鏄庯紝鍙戝竷鍗氬鏃墮渶瑕佸~鍏呬竴涓粨鏋勪綋銆備絾
涓昏娑夊強鍒扮殑鏁版嵁浠呭寘鎷細鏂囩珷鍐呭銆佹枃绔犳爣棰樸佹枃绔犲垎綾伙紙鍙夛級: 鍊煎緱娉ㄦ剰鐨勬槸錛屽鏋滄枃绔犱腑鏈夎創鍥撅紝鍒欓渶瑕佷簨鍏堝皢鍥劇墖鏂囦歡涓婁紶鍒版湇鍔″櫒銆侰PPBLOG鐨?
metaweblog API閲屾伆鏈堿PI鎻愪緵: 璇ュ嚱鏁拌鍏ュ浘鐗囨枃浠訛紝鐒跺悗璋冪敤metaWeblog.newMediaObject鎺ュ彛錛屽嵆鍙畬鎴愪笂浼犮備笂浼犳垚
鍔熷悗錛屾湇鍔″櫒浼氳繑鍥炶鍥劇墖鐨刄RL銆傜劧鍚庡湪鎴戜滑鐨勬枃绔犱腑灝卞彲浠ヤ嬌鐢ㄨ鍥劇墖浜嗐?/p>
浠呬粎灝唌etaweblog鐨勪竴浜涙帴鍙e仛灝佽錛屽浜庝竴涓彲浠ヤ嬌鐢ㄧ殑鍗氬瀹㈡埛绔潵璇磋繕榪滆繙涓嶅銆傚ぇ
閮ㄥ垎鍚岀被宸ュ叿閮芥湁涓涓弸濂界殑GUI緙栬緫鐣岄潰銆傛垜騫朵笉鎵撶畻寮勪竴涓紪杈戠晫闈㈠嚭鏉ワ紝鍚冨姏涓嶈濂?
鐨勪簨鎯呫?/p>
鎴戠殑鎵撶畻鏄厛鐢ㄥ叾浠栧伐鍏峰鏂囩珷鍋氭帓鐗堝鐞嗭紝鏈鍚庡鍑轟負html鏍煎紡銆傚洜涓篊PPBLOG鏀寔鐩存帴
鍙戝竷涓涓猦tml鏂囦歡銆傜劧鍚庡湪鐢ㄨ繖涓猯isp宸ュ叿灝嗘暣涓枃浠朵綔涓哄崥瀹㈡枃绔犲唴瀹瑰彂甯冦?/p>
鎭板ソ鍏徃鏈榪戞墦綆楃敤reStructureText(rst)鏍煎紡鏉ョ紪杈戞枃妗o紝浣滀負鐔熸倝鎵嬫錛屾垜鍐沖畾鎷胯繖涓?
鏉ョ粌鎵嬨俽st鏍煎紡闈炲父綆鍗曪紝鍚寃iki鍛戒護寰堢浉浼箋傚湪vim閲岀紪杈戣鏂囦歡闈炲父鍚堥傦紝鍥犱負榛樿鏀?
鎸併傝鍥? 鐢卞浘鍗沖彲鐪嬪嚭錛宺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爜搴?
鐭皬鐨勬帴鍙? 鍒寚鏈涙垜鍙戝竷鐨勪唬鐮佽兘澶熻浣犱竴閿湪浣犵殑鍗氬涓婄暀涓?quot;this is a test"錛屼綘鐢氳嚦鍒寚鏈涘畠鑳?
鑳藉宸ヤ綔銆備絾濡傛灉浣犳湰鏉ュ氨鏄竴涓祫娣辯殑lisper錛屾垨鑰呰櫧鐒朵笉鏄痩isper浣嗗嵈鎵ф剰鎯崇湅鐪嬬粨鏋?
銆傝繖閲屾垜灝辯畝瑕佽璇村浣曡榪欎簺浠g爜嬈箰璧鋒潵: OS Ubuntu10.04錛屼笅杞藉畨瑁匰BCL錛屼笉浼氭湁闂錛?/p>
涓嬭澆瀹夎quicklisp錛屽畼鏂規枃妗and by hand錛岀畝鍗曚笉浼氭湁闂錛?/p>
SBCL浜や簰鐜涓嬌鐢╭uicklisp瀹夎s-xml-rpc: 瑁呰澆鎴戠殑浠g爜: 鍦╤ome涓嬫坊鍔犻厤緗枃浠?cl-writer.lisp錛岄厤緗綘鍗氬淇℃伅錛屼緥濡? 濡傛灉浣犵殑鍗氬涓嶅湪CPPBLOG錛岃櫧鐒朵篃璁鎬篃鏄痬etaweblog錛屼絾鎴戜笉鑳戒繚璇佹垚鍔燂紝閰嶇疆鏂囦歡鍒?
瑕佸鏉傜偣: SBCL浜や簰鐜涓嬫祴璇? 鏈鍚庯紝緇堜簬鏁插畬榪欑瘒鏂囩珷錛屾垜闇瑕侀氳繃浠ヤ笅姝ラ鏉ュ彂琛ㄥ畠:Author:
Kevin Lynx Date:
9.29.2011 Contact:
kevinlynx at gmail dot com 鑾峰彇VPS鍙婂煙鍚?/h3>
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
浣跨敤Lisp鏋勫緩鍗氬緋葷粺
瀹夎nginx
apt-get install nginx
vi /etc/nginx/sites-avaiable/default
location / {
proxy_pass http://127.0.0.1:8000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}nginx
瀹夎Lisp鐩稿叧杞歡
apt-get instal sbcl
git clone git://github.com/kevinlynx/klprj.git
./upload-dist.sh root@codemacro.com 1234 /home/test
cd /home/test
tar xvf ext-blog.tar.gz
cd dist
sbcl(load "dep.lisp")
scp -P 1234 data/wenquanyi_12ptb.pcf root@codemacro.com:/home/test/dist/data/
apt-get install screen
./run-blog.sh
璁劇疆鍗氬
鏈鍚?/h3>
鍏充簬涓婚寮鍙?/h3>
鍏充簬緗戠粶妗嗘灦
鍏充簬鍚庡彴綆$悊
鍏充簬寮婧?/h3>
Lisp实践:开发RSS阅读器
Author: Kevin Lynx Date: 3.30.2011 Contact: kevinlynx at gmail dot com 一、RSS阅读器的实现
什么是RSS阅读器?

RSS文件
<?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>
<rss>
<channel>
<item>
</item>
<item>
</item>
...
</channel>
</rss>
交互过程
扩展
二、Lisp实现
获取RSS文件
http://m.shnenglu.com/rss.aspx
GET /rss.aspx HTTP/1.0
Host: m.shnenglu.com
解析RSS
(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)))
显示出来
(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
(cl-rss-test:test-rss-http :uri "/news/newshot/hotnewsrss.xml"
:host "cd.qq.com")

参考文档
Lisp涓鐬ワ細澧炲己鍨嬪彉閲廠ymbol
Author:
Kevin Lynx
Date:
3.21.2011
Contact:
kevinlynx at gmail dot com
Lisp涓殑“鍙橀噺"
(defparameter *var* 1)
(defvar *var* 1)
(let ((var 1))
(format t "~a" var))
Lisp涓殑鍑芥暟
(defun add2 (x)
(+ 2 x))
(defun apply-fn (fn x)
(funcall fn x))
(apply-fn add2 2) ;; wrong
(apply-fn #'add2 2) ;; right
(defun get-add-n (n)
#' (lambda (x)
(+ x n)))
;; wrong
(defvar fn #' (lambda (x) (+ x 2)))
(fn 3)
"The function FN is undefined."
“涓囨伓涔嬫簮“錛歋YMBOL
Symbol鐨勫悕瀛?/h2>
(symbol-name '|this is a symbol name|)
杈撳嚭錛?this is a symbol name"
Symbol鏈川

Symbol涓嶸ariable鍜孎unction鐨勮仈緋?/h2>
symbol-function
symbol-value
symbol-package
symbol-plist
boundp ;鍒ゅ畾Value鍩熸槸鍚﹁緇戝畾
fboundp;鍒ゅ畾Function鍩熸槸鍚﹁緇戝畾
(defvar *var* 1)
(boundp '*var*) ; 榪斿洖鐪?
(fboundp '*var*) ; 榪斿洖鍋?
(defun *var* (x) x) ; 瀹氫箟涓涓悕涓?var*鐨勫嚱鏁幫紝榪斿洖鍊煎嵆涓哄弬鏁?
(fboundp '*var*) ; 榪斿洖鐪?
More More More
(add2 3) ; add2浣嶄簬絎竴涓綅緗紝琚綋浣滃嚱鏁板鐞?
(*var* 3) ; 榪欓噷*var*琚綋浣滃嚱鏁拌皟鐢紝榪斿洖3
(*var* *var*) ; 榪欐槸姝g‘鐨勮鍙ワ紝榪斿洖1
(symbol-value *var*) ; wrong
(symbol-value 1) ; wrong
(symbol-value '*var*) ; right
(defvar *name* "kevin lynx")
(defvar *ref* '*name*) ; *ref*鐨刅alue淇濆瓨鐨勬槸鍙︿竴涓猄ymbol
(symbol-value *ref*) ; 鍙?ref*鐨刅alue錛屽緱鍒?name*錛屽啀鍙?name*鐨刅alue
;; wrong
(defvar fn #' (lambda (x) (+ x 2)))
(fn 3)
(setf (symbol-function 'fn) #' (lambda (x) (+ x 2)))
(fn 3)
(apply-fn add2 2) ; wrong
(apply-fn (symbol-function 'add2) 2)
END
娉ㄨВ
[1]
鍦↙isp涓叏灞鍙橀噺鍙堣縐頒負dynamic variables
[2]
Lisp涓寜鐓т範鎯氬父鍦ㄤ負鍏ㄥ眬鍙橀噺鍛藉悕鏃朵細鍔犱笂鏄熷彿錛屽氨鍍忔垜浠範鎯嬌鐢╣_涓鏍?/td>
[3]
鍥犱負鎴戠‘瀹炲湪蹇芥偁浣?/td>
[4]
first class type錛屾湁浜虹炕璇戜負“涓絳夊叕姘?#8221;錛屾垜瑙夊緱鍘嬪姏宸ㄥぇ
[5]
鍗抽珮闃跺嚱鏁?/td>
[6]
“瀛楅潰“涓昏鏄拡瀵硅繖浜涗俊鎭細琚瘝娉曞垎鏋愮▼搴忕洿鎺ュ鐞?/td>
[7]
榪欏彲鑳藉鑷存洿澶氱殑閿欒
鐢╨isp寮鍙戝崥瀹㈠鎴風
Author:
Kevin Lynx Date:
3.13.2011
鍏充簬榪欑瘒鏂囨。
浠栦滑鎬庝箞璇碙isp
And my opinion
寮濮嬪涔燣isp
鍗氬瀹㈡埛绔浣曞疄鐜?/h1>
blogger.deletePost錛岃皟鐢ㄨ鎺ュ彛鍗沖彲鍒犻櫎涓綃囧崥瀹㈡枃绔?
<?xml version='1.0'?>
<methodCall>
<methodName>title_or_id</methodName>
<params>
</params>
</methodCall
<?xml version='1.0'?>
<methodResponse>
<params>
<param>
<value><string>Welcome to Zope.org</string></value>
</param>
</params>
</methodResponse>
(defun delete-post (postid)
(rpc-call
"blogger.deletePost"
postid
"kevinlynx"
"password"
t))
(defun new-post (title context &optional (cates))
(rpc-call
"metaWeblog.newPost"
""
"kevinlynx"
"password"
(new-post-struct title context cates)
t))
(defun new-media-object (filename)
(rpc-call
"metaWeblog.newMediaObject"
""
"kevinlynx"
"password"
(new-media-object-struct filename)))
瀹屾暣瀹炵幇鏂規
(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
(ql:quickload "s-xml-rpc")
(asdf:load-system :cl-writer)
(in-package cl-writer)
(setf *default-user* (make-cppblog-user "璐︽埛鍚?quot; "瀵嗙爜"))
(setf *default-user* (make-user-info :name "甯愭埛鍚?quot;
:password "瀵嗙爜" :host "m.shnenglu.com"
:url "/kevinlynx/services/metaweblog.aspx"))
(in-package cl-writer)
(new-post (get-default-user) "this is a test" "title")
in shell:
rst2html.py lisp_xml_rpc.rst lisp_xml_rpc.html
in SBCL:
(writer-post-new "lisp_xml_rpc.html")
;;EOF;;