精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

Lisp永恒之道

開發(fā) 開發(fā)工具
學習Lisp所收獲的是如何“自由地”表達你的思想,這正是Lisp最大的魅力所在,也是這門古老的語言仍然具有很強的生命力的根本原因。

Lisp之魅

長久以來,Lisp一直被許多人視為史上最非凡的編程語言。它不僅在50多年前誕生的時候帶來了諸多革命性的創(chuàng)新并極大地影響了后來編程語言的發(fā)展,即使在一大批現(xiàn)代語言不斷涌現(xiàn)的今天,Lisp的諸多特性仍然未被超越。當各式各樣的編程語言擺在面前,我們可以從運行效率、學習曲線、社區(qū)活躍度、廠商支持等多種不同的角度進行評判和選擇,但我特別看中的一點在于語言能否有效地表達編程者的設計思想。學習C意味著學習如何用過程來表達設計思想,學習Java意味著學習如何用對象來表達設計思想,而雖然Lisp與函數(shù)式編程有很大的關系,但學習Lisp絕不僅僅是學習如何用函數(shù)表達設計思想。實際上,函數(shù)式編程并非Lisp的本質(zhì),在已經(jīng)掌握了lambda、高階函數(shù)、閉包、惰性求值等函數(shù)式編程概念之后,學習Lisp仍然大大加深了我對編程的理解。學習Lisp所收獲的是如何“自由地”表達你的思想,這正是Lisp***的魅力所在,也是這門古老的語言仍然具有很強的生命力的根本原因。

Lisp之源

Lisp意為表處理(List Processing),源自設計者John McCarthy于1960年發(fā)表的一篇論文《符號表達式的遞歸函數(shù)及其機器計算》。McCarthy在這篇論文中向我們展示了用一種簡單的數(shù)據(jù)結構S表達式(S-expression)來表示代碼和數(shù)據(jù),并在此基礎上構建一種完整的語言。Lisp語言形式簡單、內(nèi)涵深刻,Paul Graham在《Lisp之根源》中將其對編程的貢獻與歐幾里德對幾何的貢獻相提并論。

Lisp之形

然而,與數(shù)學世界中簡單易懂的歐氏幾何形成鮮明對比,程序世界中的Lisp卻一直是一種古老而又神秘的存在,真正理解其精妙的人還是少數(shù)。從表面上看,Lisp最明顯的特征是它“古怪”的S表達式語法。S表達式是一個原子(atom),或者若干S表達式組成的列表(list),表達式之間用空格分開,放入一對括號中。“列表“這個術語可能會容易讓人聯(lián)想到數(shù)據(jù)結構中的鏈表之類的線形結構,實際上,Lisp的列表是一種可嵌套的樹形結構。下面是一些S表達式的例子:

  1. foo  
  2. ()  
  3. (a b (c d) e)  
  4. (+ (* 2 3) 5)  
  5. (defun factorial (N)  
  6.     (if (= N 1)  
  7.         1  
  8.         (* N (factorial (- N 1)))  
  9.     )  

據(jù)說,這個古怪的S表達式是McCarthy在發(fā)明Lisp時候所采用的一種臨時語法,他實際上是準備為Lisp加上一種被稱為M表達式(M-expression)的語法,然后再把M表達式編譯為S表達式。用一個通俗的類比,S表達式相當于是JVM的字節(jié)碼,而M表達式相當于Java語言,但是后來Lisp的使用者都熟悉并喜歡上了直接用S表達式編寫程序,并且他們發(fā)現(xiàn)S表達式有許多獨特的優(yōu)點,所以M表達式的引入也就被無限期延遲了。

許多Lisp的入門文章都比較強調(diào)Lisp的函數(shù)式特性,而我認為這是一種誤導。真正的Lisp之門不在函數(shù)式編程,而在S表達式本身,Lisp***的奧秘就藏在S表達式后面。S表達式是Lisp的語法基礎,語法是語義的載體,形式是實質(zhì)的寄托。“S表達式”是程序的一種形,正如“七言”是詩的一種形,“微博”是信息的一種形。正是形的不同,讓微博與博客有了質(zhì)的差異,同樣的道理,正是S表達式讓Lisp與C、Java、SQL等語言有了天壤之別。

Lisp之道
一門語言能否有效地表達編程者的設計思想取決于其抽象機制的語義表達能力。根據(jù)抽象機制的不同,語言的抽象機制形成了面向過程、面向對象、函數(shù)式、并發(fā)式等不同的范式。當你采用某一種語言,基本上就表示你已經(jīng)“面向XXX“了,你的思維方式和解決問題的手段就會依賴于語言所提供的抽象方式。比如,采用Java語言通常意味著采用面向對象分析設計;采用Erlang通常意味著按Actor模型對并發(fā)任務進行建模。

有經(jīng)驗的程序員都知道,無論是面向XXX編程,程序設計都有一條“抽象原則“:What與How解耦。但是,普通語言的問題就在于表達What的手段非常有限,無非是過程、類、接口、函數(shù)等幾種方式,而諸多領域問題是無法直接抽象為函數(shù)或接口的。比如,你完全可以在C語言中定義若干函數(shù)來做到make file所做的事情,但C代碼很難像make file那樣聲明式地體現(xiàn)出target、depends等語義,它們只會作為實現(xiàn)細節(jié)被淹沒在一個個的C函數(shù)之中。采用OOP或是FP等其它范式也會遇到同樣的困難,也就是說make file語言所代表的抽象維度與面向過程、OOP以及FP的抽象維度是正交的,使得各種范式無法直接表達出make file的語義。這就是普通語言的“剛性”特征,它要求我們必須以語言的抽象維度去分析和解決問題,把問題映射到語言的基本語法和語義。

更進一步,如果仔細探究這種剛性的根源,我們會發(fā)現(xiàn)正是由于普通語言語法和語義的緊耦合造成了這種剛性。比如,C語言中printf("hello %s", name)符合函數(shù)調(diào)用語法,它表達了函數(shù)調(diào)用語義,除此之外別無他義;Java中interface IRunnable { ... }符合接口定義語法,它表達了接口定義語義,除此之外別無他義。如果你認為“語法和語義緊耦合“是理所當然的,看不出這有什么問題,那么理解Lisp就會讓你對此產(chǎn)生更深的認識。

當你看到Lisp的(f a (b c))的時候,你會想到什么?會不會馬上聯(lián)想到函數(shù)求值或是宏擴展?就像在C語言里看到gcd(10, 15)馬上想到函數(shù)調(diào)用,或者在Java里看到class A馬上想到類定義一樣。如果真是這樣,那它就是你理解Lisp的一道障礙,因為你已經(jīng)習慣了順著語言去思考,總是在想這一句話機器怎么解釋執(zhí)行?那一句話又對應語言的哪個特性?理解Lisp要反過來,讓語言順著你,Lisp的(f a (b c))可以是任何語義,完全由你來定,它可以是函數(shù)定義、類定義、數(shù)據(jù)庫查詢、文件依賴關系,異步任務的執(zhí)行關系,業(yè)務規(guī)則 ...

下面我準備先通過幾個具體的例子逐步展示Lisp的本質(zhì)。需要說明的是,由于Lisp的S表達式和XML的語法形式都是一種樹形結構,在語義表達方面二者并無本質(zhì)的差別。所以,為了理解方便,下面我暫且用多數(shù)人更為熟悉的XML來寫代碼,請記住我們可以很輕易地把XML代碼和Lisp代碼相互轉換。

首先,我們可以輕易地用XML來定義一個求兩個數(shù)***公約數(shù)的函數(shù):

  1. <func name='gcd' return_type='int'>  
  2.     <params>  
  3.         <a type='int'/>  
  4.         <b type='int'/>  
  5.     </params>  
  6.     <body>  
  7.         <if>  
  8.            <equals>  
  9.                <a/>  
  10.                <int>0</int>  
  11.            </equals>  
  12.         </if>  
  13.         <then>  
  14.             <return><b/></return>  
  15.         </then>  
  16.         <else>  
  17.             <return>  
  18.                 <gcd>  
  19.                     <modulo><b/><a/></modulo>  
  20.                     <a/>  
  21.                 </gcd>  
  22.             </return>  
  23.         </else>  
  24.     </body>  
  25. </func> 

其次,我們可以用它來定義類:

  1. <class name="Computer">  
  2.     <field access="private" type="MainBoard" name="main-board" />  
  3.     <field access="private" type="CPU" name="cpu" />  
  4.     <field access="private" type="Memory" name="memory" />  
  5.     <method access="public" return_type="boolean" name="powerOn" />  
  6.         <params>...</params>  
  7.         <body>...</body>  
  8.     </method>  
  9.     <method access="public" return_type="boolean" name="powerOff" />  
  10.         <params>...</params>  
  11.         <body>...</body>  
  12.     </method>  
  13. </class

還可以輕易地用它來編寫關系查詢:

  1. <sql>  
  2.     <select>  
  3.         <column name="employees.id" />  
  4.         <column name="bonus.amount" />  
  5.     </select>  
  6.     <from>  
  7.         <table name="employees" />  
  8.         <table name="bonus" />  
  9.     </from>  
  10.     <where>  
  11.         <equals>  
  12.             <column name="employees.id" />  
  13.             <column name="bonus.employee_id" />  
  14.         </equals>  
  15.     </where>  
  16. </sql> 

還可以用它來實現(xiàn)類似make file的自動化構建(語法取自ant):

  1. <project name="MyProject" default="dist" basedir=".">  
  2.     <property name="src" location="src"/>  
  3.     <property name="build" location="build"/>  
  4.     <property name="dist"  location="dist"/>  
  5.     <target name="init">  
  6.         <mkdir dir="${build}"/>  
  7.     </target>  
  8.     <target name="compile" depends="init" description="compile the source " >  
  9.         <javac srcdir="${src}" destdir="${build}"/>  
  10.     </target>  
  11.     <target name="dist" depends="compile" description="generate the distribution" >  
  12.         <mkdir dir="${dist}/lib"/>  
  13.         <jar jarfile="${dist}/lib/MyProject-${DSTAMP}.jar" basedir="${build}"/>  
  14.     </target>  
  15.     <target name="clean" description="clean up" >  
  16.         <delete dir="${build}"/>  
  17.         <delete dir="${dist}"/>  
  18.     </target>  
  19. </project> 

一口氣舉了這么多個例子,目的在于用XML這種樹形結構來說明Lisp的S表達式所能夠描述的語義。不知道你是否發(fā)現(xiàn)了S表達式和XML這種樹形語法在語義構造方面有著特別的“柔性”?我們可以輕易地用它構造出函數(shù)、變量、條件判斷語義;類、屬性、方法語義;可以輕易地構造出關系模型的select、where語義;可以輕易地構造出make的target、depends語義,等等數(shù)不清的語義。在普通語言里,你可以定義一個函數(shù)、一個類,但你無法為C語言增加匿名函數(shù)特性,也沒法給Java語言加上RAII語義,甚至連自己創(chuàng)造一個foreach循環(huán)都不行,而自定義語義意味著在Lisp之上你創(chuàng)造了一門語言!不管是面向過程,面向對象,函數(shù)式,還是關系模型,在Lisp里統(tǒng)統(tǒng)都變成了一種DSL,而Lisp本身也就成了一種定義語言的語言,即元語言(Meta Language)。

Lisp的柔性與S表達式有著密切的關系。Lisp并不限制你用S表達式來表達什么語義,同樣的S表達式語法可以表達各種不同領域的語義,這就是語法和語義解耦。如果說普通語言的剛性源于“語法和語義緊耦合”,那么Lisp的柔性正是源于“語法和語義解耦”!“語法和語義解耦”使得Lisp可以隨意地構造各種領域的DSL,而不強制用某一種范式或是領域視角去分析和解決問題。本質(zhì)上,Lisp編程是一種超越了普通編程范式的范式,這就是Lisp之道:面向語言編程(LOP, Language Oriented Programming)。Wikipedia上是這樣描述LOP的:

Language oriented programming (LOP) is a style of computer programming in which, rather than solving problems in general-purpose programming languages, the programmer creates one or more domain-specific languages for the problem first, and solves the problem in those languages ... The concept of Language Oriented Programming takes the approach to capture requirements in the user's terms, and then to try to create an implementation language as isomorphic as possible to the user's descriptions, so that the mapping between requirements and implementation is as direct as possible.

LOP范式的基本思想是從問題出發(fā),先創(chuàng)建一門描述領域模型的DSL,再用DSL去解決問題,它具有高度的聲明性和抽象性。SQL、make file、CSS等DSL都可以被認為是LOP的具體實例,下面我們再通過兩個常見的例子來理解LOP的優(yōu)勢。

例1:在股票交易系統(tǒng)中,交易協(xié)議定義若干二進制的消息格式,交易所和客戶端需要對消息進行編碼和解碼。

消息格式是一種抽象的規(guī)范,本身不對語言做任何的限制,你可以用C,C++,Java,或者Python。普通的實現(xiàn)方式是按照消息格式規(guī)范,在相應的語言中定義消息結構,并編寫相應的編解碼函數(shù)。假設為一個消息定義結構和實現(xiàn)編解碼函數(shù)的工作量為M,不同消息類型的數(shù)量為N,這種方式的工作量大致為M*N。也就是說每增加一種消息類型,就需要為該消息定義結構,實現(xiàn)編解碼函數(shù),引入bug的可能性當然也和M*N成正比。如果仔細觀察不難發(fā)現(xiàn),各個消息結構其實是高度類似的,編解碼函數(shù)也大同小異,但是普通語言卻找不到一種抽象機制能表達這種共性,比如,我們無法通過面向對象的方法定義一個基類把消息結構的共性抽象出來,然后讓具體的消息去繼承它,達到復用的目的。這正是由于普通語言的抽象維度限制所致,在普通語言中,你只能從函數(shù)、接口等維度對事物進行抽象,而恰好消息格式共性所在的維度與這些抽象維度并不匹配。

其實,不同消息類型的共性在于它們都具有相同的領域語義,比如:“某字段內(nèi)容是另一個字段內(nèi)容的md5碼”就是一種消息格式的領域語義,這種領域語義是OOP的抽象機制無法描述的。LOP的思路是先創(chuàng)建一門消息定義DSL,比如,類似Google的Protocol Buffer,Android的AIDL。然后,通過DSL編寫消息定義文件,直接聲明式地描述消息的結構特征,比如,我們可以聲明式地描述“某字段內(nèi)容是另一個字段內(nèi)容的md5碼”。我們還需要為DSL開發(fā)編譯器用于生成C、Java等通用語言的消息定義和編解碼函數(shù)。

有了消息定義DSL和編譯器之后,由于DSL編寫消息定義是一種高度聲明式的編程方法,每增加一種消息的只需要多編寫一個消息定義文件而已,工作量幾乎可以忽略不計。所有的工作量都集中在編譯器的開發(fā)上,工作量是一個常數(shù)C,與消息的數(shù)量沒有關系;質(zhì)量保證方面也只需要關注編譯器這一點,不會因為增加新的消息類型而引入bug。

例2:在圖書管理系統(tǒng)中,需要支持在管理界面上對書籍、學生、班級等各種實體進行管理操作。

如果按傳統(tǒng)的三層架構,一般需要在后端程序中為每一種實體定義一個類,并定義相應的方法實現(xiàn)CRUD操作,與之相應的,還需要在前端頁面中為每一個實體編寫相應的管理頁面。這些實體類的CRUD操作都是大同小異的,但細節(jié)又各不相同,雖然我們很想復用某些共同的設計實現(xiàn),但OOP所提供的封裝、繼承、多態(tài)等抽象機制不足以有效捕獲實體之間的共性,大量的代碼還是必須放在子類中來完成。比如,Student和Book實體類的實現(xiàn)非常相似,但是如果要通過OOP的方式去抽象它們的共性,得出的結果多半是Entity這樣的大而空的基類,很難起到復用的效果。

其實,不同實體之間的共性還是在于它們具有相同的領域語義,比如:實體具有屬性,屬性具有類型,屬性具有取值范圍,屬性不具有可讀取、可編輯等訪問屬性,實體之間有關聯(lián)關系等。LOP方法正是直接面向這種領域語義的。采用LOP方法,我們并不需要為每一個實體類單獨編寫CRUD方法,也不需要單獨編寫管理頁面,只需要定義一種DSL并實現(xiàn)其編譯器;然后,用DSL聲明式地編寫實體描述文件,去描述實體的屬性列表,屬性的類型、取值范圍,屬性所支持的操作,屬性之間的關系和約束條件等;***,通過這個實體描述文件自動生成后端的實體類和前端管理頁面。采用LOP,不論前后端采用何種技術,Java也好,C#也好,JSP也好,ASP.NET也好,都可以自動生成它們的代碼。采用LOP的工作量和質(zhì)量都集中在DSL的設計和編譯器的開發(fā),與實體的數(shù)量無關,也就是說,越是龐大的系統(tǒng),實體類越多越是能體現(xiàn)LOP的優(yōu)勢。

通過上面兩個小例子我們可以感受到,LOP是一種面向領域的,高度聲明式的編程方式,它的抽象維度與領域模型的維度完全一致。LOP能讓程序員從復雜的實現(xiàn)細節(jié)中解脫出來,把關注點集中在問題的本質(zhì)上,從而提高編程的效率和質(zhì)量。

接下來的問題是如果需要為某領域設計DSL,我們是應該發(fā)明一門類似SQL這樣的專用DSL呢,還是用XML或S表達式去定義DSL呢?它們各有何優(yōu)缺點呢?

我認為采用XML或S表達式定義DSL的優(yōu)點主要有:1) SQL、make file、CSS等專用DSL都只能面向各自的領域,而一個實際的領域問題通常是跨越多個領域的,有時我們需要將不同領域融合在一起,但是由于普通語言的剛性,多語言融合通常會是一件非常困難的事情,而XML和S表達式語法結構的單一性和“代碼及數(shù)據(jù)”的特點使得跨領域融合毫無障礙。2) 在為DSL開發(fā)編譯器或解釋器的方面,二者難度不同。對XML和S表達式定義的DSL進行語法分析非常簡單,相比之下,對SQL這樣的專用DSL進行語法分析,雖然可以借助Lex、Yacc、ANTLR等代碼生成工具,但總的來講復雜度還是要明顯高一些。

當然,XML和S表達式的優(yōu)點也正好是其缺點,由于XML和S表達式的語法形式是固定的,不能像專用DSL那樣自由地設計語法。所以,一般來講專用DSL的語法顯得更加簡潔。換句話說,XML和Lisp其實是在語法和語義間做了一個交換,用語法的限制換來了語義的靈活。

Lisp之器

接下來我們繼續(xù)探討DSL的解釋執(zhí)行問題。DSL代碼的解釋執(zhí)行一般分為3種典型的方式:1) 通過專門的解釋器解釋執(zhí)行;2) 編譯生成其他語言的代碼,再通過其他語言的解釋器解釋執(zhí)行(或編譯運行);3) 自解釋。比如,第1類的代表是SQL,上一節(jié)舉的兩個例子都屬于第2類,而第3類自解釋正是Lisp的特色。

為了理解自解釋,我們可以先從內(nèi)部DSL的解釋執(zhí)行說起。內(nèi)部DSL是指嵌入在宿主語言中的DSL,比如,Google Test單元測試框架定義了一套基于流暢接口(Fluent Interface)的C++單元測試DSL。從語義構造的角度看,內(nèi)部DSL直接借用宿主語言的語法定義了自己的領域語義,是一種語法和語義解耦;從解釋執(zhí)行的角度看,內(nèi)部DSL是隨宿主語言的解釋器而自動解釋的,不需要像外部DSL一樣開發(fā)專門的解釋器,因而實現(xiàn)的代價很低。當然,并不是說設計內(nèi)部DSL不用關心任何的解釋實現(xiàn),實際上,還是需要熟悉宿主語言的特性,并利用該特性使得DSL能隨著宿主語言的解釋器得到解釋執(zhí)行。

Lisp擁有強大的自解釋特性,這得益于***的Lisp之器:宏 (macro)。宏使得Lisp編寫的DSL可以被Lisp解釋器直接解釋執(zhí)行,這在原理上與內(nèi)部DSL是相通的,只是內(nèi)部DSL一般是利用宿主語言的鏈式調(diào)用等特性,通常形式簡陋,功能有限,而Lisp的宏則要強大和靈活得多。

C語言中也有宏的概念,不過Lisp的宏與C語言的宏完全不同,C語言的宏是簡單的字符串替換。比如,下面的宏定義:

#define square(x) (x*x)

square(1+1)的期望結果是4,而實際上它會被替換成(1+1*1+1),結果是3。這個例子說明,C語言的宏只在預編譯階段進行簡單的字符串替換,對程序語法結構缺乏理解,非常脆弱。Lisp的宏不是簡單的字符串替換,而是一套完整的代碼生成系統(tǒng),它是在語法解析的基礎上把Lisp代碼從一種形式轉換為另一種形式,本質(zhì)上起到了普通語言編譯器的作用。不同的是,普通編譯器是把一種語言的代碼轉換為另一種語言的代碼,比如,Java編譯器把Java代碼轉換成Java字節(jié)碼;而Lisp宏的輸入和輸出都是S表達式,它本質(zhì)上是把一種DSL轉換為另一種DSL。下面的例子是宏的一個典型用法。

例3:假設Lisp解釋器已經(jīng)具備解釋執(zhí)行面向過程DSL的能力,需要實現(xiàn)類似ant的自動化構建工具。

我們可以基于宏構建一門類ant的DSL,宏的作用是把類ant DSL通過宏展開變成面向過程的DSL,***被Lisp解釋器所解釋執(zhí)行。這樣用Lisp編寫的ant DSL就不需要被編譯為其他語言,也不需要像XML的ant一樣依賴于專門的解釋器了。

當然,和開發(fā)專門的解釋器/編譯器相比,Lisp的宏也并非沒有缺點,宏難以理解,開發(fā)和調(diào)試更加困難。到底是開發(fā)專門的解釋器/編譯器還是直接采用宏應該視具體情況而定。

總結

Lisp采用單一的S表達式語法表達不同的語義,實現(xiàn)了語法和語義解耦。這使得Lisp具有強大的語義構造能力,擅長于構造DSL實現(xiàn)面向語言編程,而宏使得Lisp具有自解釋能力,讓不同DSL之間的轉換游刃有余。進入Lisp的世界應當從理解面向語言編程入門,這是Lisp之道,而函數(shù)式編程和宏皆為Lisp之器,以道馭器方為正途。

后記

本文是我學習Lisp的一個總結,也是寫給有興趣學習Lisp的程序員的入門資料。必須說明,我還是一個標準的Lisp初學者,幾乎沒有寫過像樣的Lisp程序,文中的錯誤和不足在所難免,希望讀者批評指正,感謝!

原文鏈接:http://www.cnblogs.com/weidagang2046/archive/2012/06/03/tao_of_lisp.html

【編輯推薦】

  1. 天才的程序員使用Lisp語言
  2. 2010年12月編程語言排行榜:觸摸經(jīng)典語言化石之Lisp
  3. 是什么讓Lisp語言如此先進?
  4. Lisp介紹之七個原始操作符
  5. 編程語言的王道:Lisp之美
責任編輯:彭凡 來源: 博客園
相關推薦

2010-03-19 09:27:04

云計算思科HP

2013-03-29 10:13:22

lisp編譯器

2012-09-28 13:23:43

編程語言語言進化程序員

2009-09-03 18:32:43

Lisp函數(shù)

2017-03-16 09:30:56

LispAI數(shù)據(jù)結構

2020-12-16 06:34:16

MySQL字符集服務器

2017-01-05 13:31:33

Lisp加法運算

2012-11-22 10:11:16

LispLisp教程

2011-04-15 09:23:33

IETFLISP路由器

2014-12-24 13:53:48

2010-10-15 10:35:18

2013-03-18 09:30:18

Lisp

2011-10-14 09:20:48

Lisp

2015-07-30 14:45:19

java簡潔

2012-08-01 09:38:17

代碼整潔

2011-05-19 08:19:50

Lisp

2015-09-17 09:04:17

pue數(shù)據(jù)

2015-09-16 11:13:50

數(shù)據(jù)中心PUE

2015-10-22 11:17:24

并購輸贏利益

2017-04-06 18:34:16

人工智能
點贊
收藏

51CTO技術棧公眾號

国内精品久久久久影院优 | 欧美日韩精品免费观看视频完整| 色狠狠综合天天综合综合| 日韩动漫在线观看| 国产三级小视频| 欧美午夜一区| 一本一道久久a久久精品逆3p| 天堂网在线免费观看| 性欧美videoshd高清| 99久久精品99国产精品| 国产精品一区二区三区毛片淫片 | 亚洲三级在线观看视频| 91破解版在线观看| 国产精品久久久久久久久免费丝袜 | 黄色在线观看www| 中文字幕欧美区| 国产青春久久久国产毛片| 亚洲天堂网在线视频| 日韩一级不卡| 久久精品久久久久| 成年人免费观看视频网站| 国产亚洲久久| 欧美主播一区二区三区美女| 成年人网站国产| 巨大荫蒂视频欧美大片| 久久午夜国产精品| 动漫美女被爆操久久久| 一二三四区在线| 亚洲欧美不卡| 亚州成人av在线| 国产真实乱在线更新| 国产精品中文字幕亚洲欧美| 7777精品久久久大香线蕉| 91视频免费版污| 午夜久久中文| 午夜久久电影网| 300部国产真实乱| 日本精品一区二区三区在线播放| 国产午夜精品久久久久久免费视| 国产一区二区三区高清视频| 国产suv一区二区| 久久99久久精品| 国产精品亚洲美女av网站| 伊人中文字幕在线观看| 99pao成人国产永久免费视频| 欧美高清视频在线播放| 国产中文av在线| 日韩久久精品| 在线亚洲欧美视频| 91成人在线免费视频| 亚洲欧洲色图| 日韩国产欧美精品在线| 香港三日本8a三级少妇三级99| 日本少妇精品亚洲第一区| 欧美日本一区二区在线观看| 成人在线观看a| 中文字幕av一区二区三区佐山爱| 色婷婷久久久亚洲一区二区三区| 男女高潮又爽又黄又无遮挡| 中文字幕在线三区| 亚洲一区二区中文在线| 欧美国产日韩激情| 爱啪视频在线观看视频免费| 亚洲一区二区三区精品在线| 欧美日韩性生活片| 牛牛精品一区二区| 在线亚洲免费视频| 99sesese| 亚洲大奶少妇| 亚洲精品久久久久久久久久久| 欧洲一级黄色片| 国产探花在线精品| 色噜噜国产精品视频一区二区| 亚洲AV成人无码精电影在线| 欧美成人有码| 午夜免费久久久久| 中文字幕精品无码一区二区| 免费在线视频一区| 亚洲综合中文字幕在线观看| 亚洲av无码一区二区乱子伦| 97久久久精品综合88久久| 蜜桃欧美视频| 免费高清在线观看| 无码黑人精品一区二区| 香蕉久久一区| 欧美成人伊人久久综合网| 成熟妇人a片免费看网站| 亚洲成人一品| 日韩在线www| 麻豆亚洲av熟女国产一区二| 亚洲欧美视频一区二区三区| 国产乱人伦真实精品视频| 国产高清在线免费| 久久亚洲私人国产精品va媚药| 亚洲日本欧美在线| 久久香蕉一区| 欧美日韩一区二区三区免费看| 男插女视频网站| 婷婷五月色综合香五月| 久久精品国产99国产精品澳门| 日本特黄一级片| 麻豆91在线看| 国产一区在线免费| 日韩伦理在线电影| 欧美日韩午夜视频在线观看| 午夜免费福利视频在线观看| 欧美三级午夜理伦三级小说| 久久激情视频久久| 伊人中文字幕在线观看| 国产高清精品久久久久| 视频一区二区三| 国产精品69xx| 欧美日韩高清一区二区三区| 亚洲永久无码7777kkk| 亚洲色图网站| 国产精品久久久久久久久久免费| 亚洲精品国产手机| 亚洲欧洲av色图| 黄色片视频在线免费观看| 精品午夜av| 中文字幕亚洲色图| 国产69精品久久久久久久久久| 国产乱子伦视频一区二区三区 | 欧美国产精品中文字幕| 国产69精品久久久久999小说| 亚洲精品一区二区在线播放∴| 精品亚洲一区二区三区四区五区| 欧美日韩三级在线观看| 久久成人精品无人区| 欧美精品成人一区二区在线观看| 黄色小说在线播放| 在线综合视频播放| 美国黄色特级片| 石原莉奈在线亚洲三区| 久久五月天婷婷| 国产精品69xx| 精品国产一区二区三区久久久蜜月| 久久一级免费视频| 热久久久久久久| 日韩电影免费观看在| 刘亦菲一区二区三区免费看| 日韩高清有码在线| 免费观看成人毛片| 99在线精品免费| 久久久久免费看黄a片app| 日韩精品成人在线观看| 日韩有码视频在线| 国产精品欧美综合亚洲| 一色屋精品亚洲香蕉网站| 九色porny91| 欧美日韩播放| 国产精品久久二区| 97视频精彩视频在线观看| 色婷婷精品久久二区二区蜜臀av| 37p粉嫩大胆色噜噜噜| 亚洲一区激情| 欧美日韩亚洲综合一区二区三区激情在线| 国产盗摄——sm在线视频| 亚洲国产精品成人精品| 天天综合天天干| 久久久国产精品麻豆| 国产精品亚洲αv天堂无码| 免费精品国产| 国产精品十八以下禁看| 久久精品视频免费看| 欧美一区二区三区在线电影| 久久久久久久久久99| 不卡av免费在线观看| 欧美日韩国产精品激情在线播放| 亚洲专区视频| 国产精品中文字幕久久久| 国产在线高清视频| 精品国产乱码久久久久久1区2区| 日本网站在线播放| 国产校园另类小说区| 9l视频白拍9色9l视频| 亚洲网色网站| 国内精品二区| 欧美日韩尤物久久| 欧美成人免费播放| 五月婷婷六月丁香综合| 在线视频欧美精品| 成人免费视频网站入口::| 成人涩涩免费视频| 欧美性猛交久久久乱大交小说| 99热国内精品| 精品九九九九| 深夜福利亚洲| 97在线视频一区| 色多多视频在线观看| 精品国产免费一区二区三区四区 | 激情视频一区二区三区| 欧洲精品一区二区三区在线观看| 四虎国产成人精品免费一女五男| 国产精品亚洲成人| 亚洲人成无码www久久久| 亚洲高清资源在线观看| 久久精品magnetxturnbtih| 六九午夜精品视频| 8050国产精品久久久久久| 日本网站在线免费观看视频| 亚洲电影在线观看| 在线视频免费观看一区| 亚洲成人免费看| 九九热久久免费视频| 白白色亚洲国产精品| 污视频网址在线观看| 国产亚洲综合精品| 国产日韩欧美大片| 国产一区99| 国产精品伊人日日| 高清精品久久| 国产精品成人免费电影| 麻豆蜜桃在线观看| 美女撒尿一区二区三区| 国产在线播放av| 亚洲精品二三区| a级片免费视频| 欧美日韩综合在线免费观看| 国产一区二区三区影院| 亚洲另类色综合网站| 国产成人一区二区在线观看| 不卡av电影在线播放| 亚洲一区二区三区三州| 精品一区二区成人精品| 欧美视频第三页| 伊人久久综合| 免费看欧美一级片| 中文在线播放一区二区| 亚洲在线不卡| 欧美一区二区三| 欧美资源一区| 天堂99x99es久久精品免费| 99三级在线| 日韩在线成人| 91成人理论电影| 国内精品视频| 7777奇米亚洲综合久久| 97精品资源在线观看| 成人激情视频在线观看| 日韩黄色碟片| 国产美女精品免费电影| 永久免费网站视频在线观看| 51亚洲精品| 肥熟一91porny丨九色丨| 国产一区二区在线观| 成人免费福利视频| 电影中文字幕一区二区| 成人免费直播live| 中文字幕日本一区| 国产欧美日韩免费看aⅴ视频| 亚洲精品555| 国产在线播放不卡| 亚洲ww精品| 亚洲自拍另类欧美丝袜| 亚洲精品在线国产| av免费观看久久| 精品女人视频| 久久久久久亚洲精品不卡4k岛国 | 午夜亚洲视频| 国内外成人免费激情视频| 久久青草久久| 日本www.色| 麻豆精品一区二区| 天堂在线精品视频| 成人中文字幕合集| 中文字幕av观看| 欧美国产乱子伦 | 一级片免费在线观看视频| 国产精品中文有码| 2一3sex性hd| 国产欧美一区二区精品婷婷| 青青青视频在线免费观看| 1024国产精品| 日韩欧美一区二区一幕| 色欧美日韩亚洲| 一区二区国产欧美| 日韩精品一区二区三区在线观看| 五月婷婷在线播放| 在线看福利67194| 在线观看中文| 欧美性做爰毛片| 亚洲成人a级片| 国产午夜精品一区| 青青草91久久久久久久久| 国产在线观看欧美| 久久久青草婷婷精品综合日韩 | 成人免费av资源| 国产特黄级aaaaa片免| 中文字幕乱码亚洲精品一区| 激情五月婷婷小说| 色先锋aa成人| 国产成人精品a视频| 香蕉精品视频在线观看| 国产欧美日韩视频一区二区三区| 伊人春色之综合网| 青青草原网站在线观看| 影音先锋一区| 中文字幕在线综合| caoporen国产精品视频| 国内毛片毛片毛片毛片毛片| 亚洲成人tv网| 国产精品一二三四五区| 日韩av在线网| 污污片在线免费视频| 国产成人久久久| 国产精品流白浆在线观看| 亚洲图片小说在线| 国产精品毛片一区二区三区| 日本中文字幕在线不卡| 欧美高清在线精品一区| 国产无精乱码一区二区三区| 欧美三级三级三级爽爽爽| 熟妇人妻av无码一区二区三区| 久久精品国产2020观看福利| 久久99久久99精品免观看软件| 99在线看视频| 亚洲精品成人影院| 搡女人真爽免费午夜网站| 99精品黄色片免费大全| 九九热最新地址| 欧美日韩在线三级| 免费一级在线观看播放网址| 久久欧美在线电影| 欧美9999| av动漫免费观看| 免费成人你懂的| av男人的天堂av| 狠狠躁夜夜躁人人躁婷婷91| 日本黄色不卡视频| 欧美日韩高清在线观看| 婷婷丁香久久| 亚洲精品白虎| 日韩高清一区二区| a级在线观看视频| 欧美精品尤物在线观看| 久久久久成人网| 视频欧美精品| 正在播放一区| 久久精品99国产精品| 精品人妻中文无码av在线 | 精品国产第一国产综合精品| 亚洲日本理论电影| 久久99精品国产麻豆不卡| 国产一级淫片久久久片a级| 欧美日韩在线播放| 幼a在线观看| 国产精品一区电影| 日韩精品久久| 久久久久久久久久一区| 中文字幕日韩av资源站| 国产人妖一区二区三区| 久久国产精品久久精品| 亚洲精品一区国产| 可以看毛片的网址| 99精品国产热久久91蜜凸| 亚洲欧美偷拍一区| 在线视频一区二区| 96视频在线观看欧美| 人妻激情另类乱人伦人妻| 粉嫩嫩av羞羞动漫久久久| 日韩成人一区二区三区| 亚洲精品国产精品国自产观看浪潮| yellow在线观看网址| 国产欧美精品一区二区三区| 久久久亚洲人| 日本猛少妇色xxxxx免费网站| 欧美日韩卡一卡二| 最近中文字幕免费mv2018在线 | 亚洲欧美成人vr| 污视频免费在线观看网站| 亚洲特黄一级片| 国产成人无码www免费视频播放| 久久久在线观看| 久9久9色综合| 在线免费黄色网| 亚洲va在线va天堂| 成年人在线观看网站| 91香蕉嫩草影院入口| 99国产精品视频免费观看一公开| 国产ts在线播放| 3d动漫精品啪啪一区二区竹菊| 国产精品国精产品一二| 日本高清一区| 国产不卡一区视频| 草莓视频18免费观看| 久久电影一区二区| 亚洲免费成人av在线| 午夜激情视频网| 日韩欧美国产成人| 97影院秋霞午夜在线观看| 久久另类ts人妖一区二区| 精品一区二区三区久久| 日韩欧美亚洲一区二区三区| 日韩在线视频观看| 久久激情av| 日韩精品aaa| 91久久精品一区二区二区| 精品人妻一区二区三区免费看| 精品一区二区三区免费视频|