2008-09-21 37 views
21

Một số câu hỏi về ngôn ngữ lập trình hàm đã khiến tôi suy nghĩ về việc liệu XSLT có phải là ngôn ngữ lập trình chức năng hay không. Nếu không, những tính năng nào bị thiếu? XSLT 2.0 có rút ngắn hay đóng khoảng cách không?XSLT có phải là ngôn ngữ lập trình chức năng không?

+2

Eric, Bạn sẽ được quan tâm để biết rằng XSLT 3.0 ** là ** một ngôn ngữ lập trình chức năng thực sự. Nó sử dụng XPath 3.0 trong đó các hàm là các đối tượng lớp đầu tiên và có thể được chuyển thành các tham số cho các hàm khác hoặc được trả về như là kết quả của việc gọi một hàm. –

Trả lời

26

XSLT là khai báo ngược với trạng thái.

Mặc dù XSLT dựa trên ý tưởng lập trình chức năng, nhưng nó không phải là ngôn ngữ lập trình đầy đủ chức năng, nó thiếu khả năng xử lý các hàm như kiểu dữ liệu lớp đầu tiên. Nó có các yếu tố như đánh giá lười biếng để giảm đánh giá không cần thiết và cũng không có các vòng lặp rõ ràng.

Giống như ngôn ngữ chức năng, tôi nghĩ rằng nó có thể được song song độc đáo với luồng đa luồng an toàn tự động trên một số bộ xử lý.

Từ Wikipedia on XSLT:

Là một ngôn ngữ, XSLT bị ảnh hưởng bởi ngôn ngữ chức năng, và bởi ngôn ngữ dựa trên văn bản phù hợp với mô hình như SNOBOL và awk. Người tiền nhiệm trực tiếp nhất của nó là là DSSSL, một ngôn ngữ mà thực hiện chức năng tương tự cho SGML mà XSLT thực hiện cho XML. XSLT có thể cũng được coi là một bộ xử lý mẫu .

Đây là trang web tuyệt vời về sử dụng XSLT as a functional language với sự trợ giúp của FXSL. FXSL là một thư viện thực hiện hỗ trợ cho các hàm bậc cao hơn.

Vì FXSL Tôi không nghĩ rằng XSLT có nhu cầu phải có đầy đủ chức năng. Có lẽ FXSL sẽ được đưa vào tiêu chuẩn W3C trong tương lai, nhưng tôi không có bằng chứng về điều này.

+1

XSLT không có vòng lặp rõ ràng: http://www.w3schools.com/xsl/el_for-each.asp – recursive

+0

@recursive: đây không phải là _loops_ theo nghĩa bắt buộc của từ. Thứ tự thực hiện không được đảm bảo (điều này giúp giảm bớt việc triển khai song song). Tôi nghĩ rằng một tương tự gần là với 'xsl: for-each' bạn tạo một _project_ trên một tập hợp. – Abel

+0

@Abel: Thứ tự của đầu ra dường như được đảm bảo và tôi không thấy sự khác biệt hữu ích giữa thứ tự thực thi thực tế và thứ tự của kết quả cuối cùng. Đó dường như là một chi tiết thực hiện. – recursive

4

Phần lớn, điều làm cho XSLT không phải là ngôn ngữ lập trình hàm 100% là không có khả năng xử lý các hàm như một kiểu dữ liệu hạng nhất.

Có thể có một số khác - nhưng đó là câu trả lời rõ ràng.

Chúc may mắn!

4

Saxon-SA đã giới thiệu một số chức năng mở rộng tạo chức năng XSLT. Bạn có thể sử dụng saxon:function() để tạo giá trị hàm (thực tế là giá trị {http://net.sf.saxon/java-type}net.sf.saxon.expr.UserFunctionCall) mà sau đó bạn gọi với saxon:call().

Saxon-B có chức năng tương tự với việc ghép nối saxon:expression()saxon:eval(). Sự khác biệt là saxon:expression() nhận bất kỳ biểu thức XPath nào và saxon:eval() đánh giá nó, trong khi saxon:function() lấy tên của hàm mà saxon:call() gọi.

+0

fwiw này cũng có thể trong .NET một lần nữa thông qua phần mở rộng, và imho không phải là thanh lịch – annakata

+1

Không có phần mở rộng là cần thiết cho lập trình chức năng trong XSLT và Jeni biết điều này tốt: http://fxsl.sf.net. FXSL - Thư viện lập trình chức năng cho XSLT đã tồn tại được hơn 8 năm. Nó được viết hoàn toàn bằng chính XSLT. Thực hiện gần như hoàn toàn các chức năng Praskude Haskell. –

+0

Trong XSLT 3.0, đi kèm với XPath 3.0 hoặc 3.1, các chức năng bây giờ là công dân hạng nhất và có thể được chuyển xung quanh thành các mục, hoặc được gọi, vv Không cần mở rộng thêm nữa. – Abel

6

Đó là loại cảm giác khi tôi lập trình nó.

XSLT hoàn toàn dựa trên việc xác định hàm và áp dụng chúng cho các sự kiện đã chọn đi xuống luồng đầu vào.

XSLT cho phép bạn đặt biến. Lập trình chức năng không cho phép các chức năng có tác dụng phụ - và đó là một vấn đề lớn.

Tuy nhiên, viết bằng XSLT, người ta có cùng "cảm thấy như đang làm việc trong thời trang FP.Bạn đang làm việc với đầu vào - bạn không thay đổi nó - để tạo đầu ra.

Đây là một mô hình lập trình rất, rất khác với mô hình được sử dụng khi làm việc với API DOM. DOM không tách biệt đầu vào và đầu ra. Bạn được giao một cấu trúc dữ liệu - và bạn mang nó theo cách bạn thấy phù hợp - không do dự, hạn chế hoặc hối hận.

Đủ để nói nếu bạn thích FP và các nguyên tắc đằng sau nó, bạn có thể cảm thấy thoải mái khi làm việc trong đó. Cũng giống như trải nghiệm với lập trình hướng sự kiện - và chính XML - cũng sẽ làm bạn cảm thấy thoải mái với nó.

Nếu trải nghiệm duy nhất của bạn là từ trên xuống, các chương trình không hướng sự kiện - thì XSLT sẽ rất lạ, cảnh quan ngoài hành tinh thực sự. Ít nhất là lúc đầu. Phát triển một chút kinh nghiệm và sau đó quay trở lại XSLT khi các biểu thức XPath và xử lý sự kiện thực sự thoải mái với bạn sẽ trả hết tiền.

+1

Có, XSL cho phép bạn đặt biến, nhưng không thay đổi. –

+0

Bạn nói đúng! Tôi đã sửa chữa vào thời điểm đó. Cảm ơn bạn đã kêu gọi sự chú ý đến nó. Khi bạn đặt một giá trị biến trong XSLT, bạn không thể thay đổi nó. Tôi thực sự gặp một chút vấn đề với điều đó một lần khi tôi quên/bỏ qua điều đó. – JohnnySoftware

+0

Bạn biết đấy, tôi nghĩ họ nên làm điều đó rõ ràng hơn trong ngôn ngữ, bởi vì tôi chắc chắn bạn và tôi không phải là người duy nhất rơi vào đó. '' làm cho tôi nghĩ về điều gì đó thay đổi (tại thời gian chạy) - '' sẽ chính xác hơn. Trong thực tế, tôi nhớ kinh nghiệm của tôi với XSLT là vụng về đặc biệt bởi vì tôi mong đợi nó hoạt động theo cách mà nó không thực sự được dự định, nhiều lập trình viên Java sẽ cảm thấy lần đầu tiên họ sử dụng Javascript. –

0

Đó không phải là thực sự một cuộc tranh cãi, vì bạn chỉ có thể khai báo các biến, không thay đổi giá trị của họ sau khi tuyên bố. Theo nghĩa đó, nó là kiểu khai báo không bắt buộc, như đã nêu trong bài báo của ông Novatchev.

ngôn ngữ lập trình chức năng như Đề án hoặc Erlang cho phép bạn khai báo các biến là tốt, và trong Haskell bạn cũng có thể làm điều đó:

- chức năng 'test' mất biến x và thêm nó vào mọi phần tử của danh sách xs

test :: [Int] -> [Int]<br> 
test xs = map (+ x) xs<br> 
where x = 2 
Các vấn đề liên quan