2011-04-04 34 views
8

嘿,這是比什麼哲學問題。我已經寫了我的第一個Web應用程序,在http://bloozit.com波士頓事件日曆我寫在Python,和我與它的簡單很高興,不過,我的Python包含HTML,CSS和Javascript的斑點,像燉魚頭和漂浮在其中的眼球。Web應用程序中的語言同質性有多大優勢?

然後,我在使用Lisp的網絡應用程序中看到了這個教程:http://www.adampetersen.se/articles/lispweb.htm我讀過Lisp並在Lisp中編寫了一些軟件,所以我不是Paul Graham,但我對它很熟悉。有一點非常吸引我的是,作者是如何從Lisp中生成HTML和Javascript的,這使得整個事情變得很好,同質化。

的問題是,如何可貴的是,在現實世界中是同質化?每當出現任何錯誤,你必須加載頁面了螢火蟲,然後你會看生成的HTML,CSS和Javascript,而不是Lisp的來源,所以你必須保持你的頭的映射。 Lisp提供的同質性是否真的能解決任何問題,或僅僅是解決問題的壁紙,最終會再次向下遊彈出?

如果有人在那裏誰實際上嘗試了兩種方法,我會真的喜歡聽到你的聲音!

回答

5

嗯,我度過了parenscript和HT-AJAX一年編碼,並最終放棄了,只是(仍然在服務器上使用hunchentoot)產生手工的JavaScript。我發現結果更具可預測性,正如你在你的問題中暗示的那樣,這使得使用螢火蟲時發生的事情變得更容易。 (我也切換到使用jquery,這比ht-ajax好得多,但這不是你真正想要的)。

這麼說,我大量建議CL-誰(http://weitz.de/cl-who/),這使得動態生成HTML更整潔的。

1

JavaScript是真正從CSS和HTML單獨的一類,如果你正在做的事情一樣parenscript。聽起來好像做得很好。但是,我沒有經歷過這樣的例子。我沒有嘗試parenscript,但魯珀特的答案不好說。就我個人而言,我使用coffescript,而不是映射現有的語言,而是在它之上構建一個更好的語言。你知道它會產生什麼,因爲它非常乾淨地映射到JavaScript,這使得它很容易調試。

如果你只是想從你的應用程序轉換爲JavaScript插入值,那麼原理類似於這樣做的HTML和CSS。下面我會說我是一個Ruby的web開發人員,作爲貢獻者Haskell的web框架Yesod經歷 - 但我認爲它推廣到Web開發中的任何一種語言。

想到一個HTML模板作爲生成HTML一個DSL的。在標籤名稱(或其他語言/系統製作標籤名稱函數調用)之前放置了一堆冒號,是否真的改進了DSL?很明顯,這是一種可以輕鬆操作模板而不是使模板語言更好的語言,這種語言可以用於編程語言。

Lisp的代碼不需要關閉標籤,但沒有理由爲什麼一個模板應。 HAML最初是用Ruby編寫的,其概念現在已經被移植到其他語言的一個非常強大和DRY模板語言,有不同的語法,保持白色系的空間佈局,而不是寫結束標記的重要概念,其他模板語言。我對HAML的問題是它完全摒棄了html語法。我覺得像HAML而不是代碼一樣,它是用鞋做成的。在Yesod網絡框架中,我們採用了HAML概念,但使用了正常的HTML語法DRY-我們稱之爲hamlet

其中一個原因代碼生成所有 HTML是因爲否則可能會很麻煩堅持你的模板片斷一些直接進入代碼 - 我們已經解決了這個很好的小村莊中使用Haskell的quasiquotes-其他語言你可能需要一個函數調用和一個多行字符串,根據多行字符串語法的不同,這在程度上會更加麻煩。

這些概念在CSS中工作得很好。 HAML用戶使用SASS或SCSS,(我們現在也將其移植到Yesod)。 Here are python equivalents

因此,模板表示html代碼無法匹配的所有語法都是免費的。 如果一個模板允許你調用生成html的helper函數,那麼你並沒有失去太多的力量。

從代碼生成html,css和js的一個方面是將它們組合在一起並與應用程序邏輯交互的簡單功能。例如,如果您希望使用JavaScript日曆彈出式窗口的日期字段,則需要一些html,css和js全部一起工作 - 並且您希望這些字段位於中的彼此旁邊,但位於遠離html頁面中的彼此,或者在客戶端收到時分離文件。在Yesod中,我們有widgets來完成代碼或3個獨立文件。在HAML中,可以將相同模板的部分聲明爲html,javascript或css,但如果要以更智能的方式組合它們,則需要從框架或應用程序中獲得自己的幫助器。

4

問題是,在現實世界中同質性的價值有多大?

可能相當重要:看看所有做服務器端Javascript的人。 Javascript在任何情況下都不是最高級的,它對服務器端代碼的庫支持並不是那麼好,但是使用它有很大的收穫。

每當出現任何錯誤,你必須加載在Firebug的頁面時,

取決於什麼「東西」是。我實際上還記得上一次我不得不打開Firebug來看看發生了什麼問題 - 我確實經歷過這個階段,但也有很多次不是這樣。例如,如果你從s-exps生成你的CSS,那麼你的CSS的問題可能只會讓你需要查看「編譯」CSS怪異的語法問題(如IE6技巧)。如果你只是看看頁面,並決定你需要一個額外的邊框,那麼你可以添加(:border 1)並完成它。 (當然,如果你處理這些來生成一整套CSS規則來服務於客戶端,那麼這是一個更大的勝利。)

另一種思考方式:在極少數情況下,我需要在現代Web應用程序上工作時,請拔出數據包嗅探器和反彙編器。是的,這很糟糕,但是有了好的圖書館,這也是非常罕見的。我不想整天寫低級代碼,只是爲了避免在需要這種級別的信息的情況下,在極少數情況下切換到數據包嗅探器的阻抗不匹配。

這假定你想達到你寫作(V)HLL代碼的水平。Common Lisp無法在C語言中擊敗C語言,如果你只是試圖在HTML中吐出一個簡單的博客,那麼你就不在那裏了:Rails真的很擅長這種事情。但是有大量的實驗性編程能夠改變一個標誌並在客戶端運行代碼,而不是服務器是有用的。

,然後你會看生成的HTML,CSS和Javascript,而不是Lisp的來源,所以你必須保持你的頭的映射。 Lisp提供的同質性是否真的能解決任何問題,或僅僅是解決問題的壁紙,最終會再次向下遊彈出?

我已經寫全Lisp和所有JavaScript的Web應用程序,我認爲最好的答案我現在可以給的是:它可以。我使用過Parenscript,主要的問題是Parenscript是一種Lisp-y語言,但它不是Common Lisp,也不是可以在服務器端使用的任何其他完整語言。 (如果有一個用於Javascript編譯器的Common Lisp,就像GWT是用於Java的,那麼它會很棒,但我沒有看到任何人認真地嘗試製作一個。)所以,如你所見,兩種語言。

JavaScript是一個好一點的今天,在這方面,因爲你可以準確地運行在兩地相同的代碼。這不是相當理想的,因爲你的服務器端JavaScript可能有,你不能保證會存在於客戶端功能(除非你限制你的用戶,比方說,火狐的最新版本)。如果你像我一樣,你不想限制你的服務器代碼到每個瀏覽器中運行的JS,所以你的服務器端JS和客戶端JS將會是微妙的不同。這不是一個破壞者 - 它仍然很不錯 - 但它仍然是兩種略有不同的語言。

我認爲這將是很酷的,如果有,可以採取寫在最新的Javascript(1.8.5)的代碼,並生成老派的Javascript在任何瀏覽器中運行的程序。我不認爲這樣的計劃存在,但我不知道它會有多困難。

有計劃的實現Javascript的,所以可能與計劃情況較好。我應該仔細研究一下這些日子。

不必使用服務器端語言,是從我的客戶端語言(JavaScript)的完全不一樣,當我屢屢受挫。但是當我不得不使用低於Lisp的語言(大多數語言)時,我也感到沮喪。像Lisp一樣,還是更像Javascript是更大的勝利?我不知道。我希望我不必選擇。

1

這與其說是一個答案,一個強烈的意見,但根本的問題是,HTML和CSS是太可怕了(1)。它既沒有做好它應該做的事情。 Javascript是更好的,並且經常被迫服務以彌補這兩個(2)的缺點,但它不是一個理想的解決方案(3)。因爲需要服務器端語言來生成HTML和CSS,這使得混亂更加複雜。最簡單的Web應用程序需要用不少於四種不同的語言編程是很可笑的。

所以,是的,您希望擁有一種可靠的語言來代替其他語言,這是可以理解的,但只要您正在編寫生成HTML/CSS的代碼,以至於您必須關注HTML和CSS的細節,那麼你只是戴着連指手套,當你去彈鋼琴時可能會(可能是「讀」)干擾。如果你的Lisp代碼如下所示:(:body(:div(:@(:style(:border「1」)))(:p「hello」))),那麼你並不是真的沒有問題瘟疫你。我個人認爲我們需要別的東西來代替我們現在得到的湯,它應該將編譯爲HTML/CSS/JS的,但是讓用戶不要擔心。 C編譯爲彙編語言,但C程序員從來沒有看到它編譯到自己的代碼中的STA,MOV,LDX操作碼。而且,如果它很受歡迎,那麼瀏覽器可以直接支持它。無論如何,這只是一個想法。一絲微光。

好運,

克里斯 - 帕金斯
medialab.com

(1)HTML文檔與圖片,腳本,樣式等的複合文檔都被存儲在其他文件中。但HTML文檔無法做的一件事是流暢地嵌入另一個HTML文檔 - 它最需要的一件事。 iframes/object標記的大小是固定的,並對SEO產生不利影響。這個簡單的任務往往是很多網站上使用像PHP這樣的服務器端語言的唯一原因。
你不需要我告訴你CSS有多糟糕。 (2)例子很多:LESS(lesscss.org),document.write,AJAX,等等。

(3)Javascript DOM和CSS規則之間的阻抗不匹配幾乎令人難以置信。 DOM中有多少高度(scrollHeight,offsetHeight,clientHeight等)? 4個或更多,也許?有多少可通過CSS尋址? 0或1. 另外,雖然JavaScript可以插入很多漏洞,但它通常會犧牲搜索引擎優化