2009-09-01 37 views
14

Trong công việc thường lệ của tôi, tôi đã xảy ra để viết chức năng javascript bị xích giống như biểu thức LINQ để truy vấn kết quả JSON.Có thể lập trình meta trong Javascript?

var Result = from(obj1).as("x").where("x.id=5").groupby("x.status").having(count("x.status") > 5).select("x.status"); 

Nó hoạt động hoàn hảo và đưa ra kết quả mong đợi.

tôi đã tự hỏi điều này có vẻ tuyệt vời nếu mã được viết như thế này (trong một cách dễ đọc hơn)

var Result = from obj1 as x where x.status 
groupby x.status having count(x.status) > 5 
select x.status; 

là có một cách để đạt được điều này ??

Cheers

Ramesh Vel

+4

\ * ho \ * http://www.hugoware.net/Projects/jLinq \ * cough \ * –

+0

Bạn có thể đặt mã của mình vào một số thẻ HTML hoặc tệp văn bản. Sau đó, bạn có thể có DSL của riêng bạn với Javascript ... – Philip

Trả lời

17

số JavaScript không hỗ trợ này.

Nhưng điều này có vẻ khá tốt quá:

var Result = from(obj1) 
      .as("x") 
      .where("x.id=5") 
      .groupby("x.status") 
      .having(count("x.status") > 5) 
      .select("x.status"); 
5

mặc dù không hoàn toàn những gì bạn muốn, chúng ta có thể viết phân tích cú pháp trong javascript, và chỉ phân tích các truy vấn (lưu dưới dạng chuỗi) và sau đó thực hiện nó. ví dụ: sử dụng các thư viện như http://jscc.jmksf.com/ (không nghi ngờ có những người khác ở ngoài đó) không nên quá khó để triển khai.

nhưng những gì bạn có trong câu hỏi có vẻ tuyệt vời, tôi không chắc chắn lý do tại sao bạn muốn nó trông giống như cách bạn đề xuất.

+0

cảm ơn trả lời Chii .. Thực ra tôi đã thử nghiệm các khả năng khác nhau. i am với C# nền, recentlty bắt đầu trong javascript và chỉ muốn khám phá các tính năng JS ... thats lý do .. Và cảm ơn cho liên kết .. Tôi đã nhìn xung quanh các phân tích cú pháp JS như một trong những bạn đã đề cập .. và tôi tìm thấy http://www.codeplex.com/jsinq là hữu ích .. cảm ơn một lần nữa .. – RameshVel

1

Wat bạn muốn là thay đổi trình phân tích cú pháp javascript thành một trình phân tích cú pháp SQL. Nó không được tạo ra để làm điều đó, cú pháp javascript không cho phép bạn.

Những gì bạn có là 90% như SQL (nó ánh xạ thẳng vào nó) và một javascript hợp lệ 100%, đây là một thành tích tuyệt vời. Câu trả lời của tôi cho câu hỏi trong tiêu đề là: YES, metaprogramming là có thể, nhưng NO nó sẽ không cung cấp cho bạn một trình phân tích cú pháp SQL, vì nó bị ràng buộc để sử dụng ngữ pháp javascript.

6

Hầu hết mọi người khăng khăng cố gắng lập trình meta từ bên trong ngôn ngữ yêu thích của họ. Điều đó không hiệu quả nếu ngôn ngữ không hỗ trợ lập trình meta tốt; các câu trả lời khác đã quan sát thấy rằng JavaScript không có.

Cách xung quanh việc này là thực hiện lập trình meta từ bên ngoài ngôn ngữ, sử dụng program transformation tools. Các công cụ như vậy có thể phân tích cú pháp mã nguồn, và thực hiện các phép biến đổi tùy ý trên nó (đó là những gì metaprogramming làm anyway) và sau đó nhổ chương trình sửa đổi.

Nếu bạn có một hệ thống chuyển đổi chương trình mục đích chung, có thể phân tích ngôn ngữ tùy ý, bạn có thể thực hiện lập trình meta trên/với bất kỳ ngôn ngữ nào bạn muốn. Xem DMS Software Reengineering Toolkit của chúng tôi cho một công cụ như vậy, có các giao diện người dùng mạnh mẽ cho C, C++, Java, C#, COBOL, PHP và ECMAScript và một số ngôn ngữ lập trình khác, và đã được sử dụng để lập trình meta trên tất cả các công cụ này.

Trong trường hợp của bạn, bạn muốn mở rộng ngữ pháp JavaScript bằng cú pháp mới cho truy vấn SQL, sau đó chuyển đổi chúng thành JavaScript thuần túy. (Điều này rất giống Lập trình có chủ ý) DMS sẽ dễ dàng cho phép bạn xây dựng một phương ngữ JavaScript với các quy tắc bổ sung, và sau đó bạn có thể sử dụng khả năng chuyển đổi chương trình của nó để tạo ra Javascript chuẩn tương đương.

Có nói rằng, tôi không phải là một fan hâm mộ tuyệt vời của "cú pháp tùy chỉnh cho mọi lập trình viên trên hành tinh" là nơi Lập trình có chủ ý dẫn IMHO.

Đây là một việc tốt cần làm nếu có một cộng đồng người dùng lớn có thể thấy điều này có giá trị. Ý tưởng này có thể hoặc không thể là một trong số chúng; một phần của vấn đề là bạn không thể tìm ra mà không làm thí nghiệm, và nó có thể không đạt được đủ lực kéo xã hội cho vấn đề.

3

Vâng, trong mẫu mã của bạn:

var Result = from(obj1) 
      .as("x") 
      .where("x.id=5") 
      .groupby("x.status") 
      .having(count("x.status") > 5) 
      .select("x.status"); 

Vấn đề duy nhất tôi nhìn thấy (trừ select sử dụng như một định danh) là bạn nhúng một vị như một đối số chức năng. Thay vào đó, bạn phải đặt hàm đó làm chức năng:

  .having(function(x){ return x.status > 5; }) 

JavaScript có tính năng đóng và gõ động, vì vậy bạn có thể thực hiện một số điều thực sự tiện lợi và thanh lịch trong đó. Chỉ cần cho bạn biết.

+0

cảm ơn Joey, thats một ý tưởng tốt .. :) – RameshVel

2

Trong JS thuần túy, bạn không thể. Nhưng với bộ tiền xử lý thích hợp thì có thể.

Bạn có thể làm điều gì đó tương tự với sweet.js macro hoặc (Thiên Chúa tha thứ cho tôi) GPP.

1

Xét rằng câu hỏi này được hỏi một vài năm trước, tôi sẽ cố gắng thêm nhiều hơn vào nó dựa trên các công nghệ hiện tại.

Kể từ ECMAScript 6, lập trình meta bây giờ được hỗ trợ theo nghĩa thông qua các đối tượng Symbol, ReflectProxy.

Bằng cách tìm kiếm trên web, tôi tìm thấy một loạt các bài báo rất thú vị về đề tài này, được viết bởi Keith kirkel:

Metaprogramming in ES6: Symbols and why they're awesome

Nói tóm lại, biểu tượng là nguyên thủy mới có thể được thêm vào trong một đối tượng (mà không có tính chất thực tế) và rất tiện lợi cho việc chuyển các đặc tính lập trình meta cho nó trong số những thứ khác. Ký hiệu là tất cả về việc thay đổi hành vi của các lớp hiện có bằng cách sửa đổi chúng (Reflection trong thực hiện).

Metaprogramming in ES6: Part 2 - Reflect

Nói tóm lại, Reflect là một cách hiệu quả một bộ sưu tập của tất cả những “phương pháp nội bộ” mà đã có sẵn độc quyền thông qua các internals engine JavaScript, bây giờ tiếp xúc trong một đối tượng duy nhất, tiện dụng. Cách sử dụng của nó tương tự như khả năng phản chiếu của Java và C#. Chúng được sử dụng để khám phá thông tin cấp độ rất thấp về mã của bạn (Phản ánh thông qua nội tâm).

Metaprogramming in ES6: Part 3 - Proxies

Nói tóm lại, Proxy là đối tượng xử lý, chịu trách nhiệm về gói các đối tượng và chặn hành vi của họ thông qua bẫy (Reflection qua lời chuyển cầu).Tất nhiên, những đối tượng này cung cấp khả năng lập trình meta cụ thể, hạn chế hơn nhiều so với ngôn ngữ lập trình meta, nhưng vẫn có thể cung cấp các cách lập trình meta cơ bản, chủ yếu thông qua thực hành phản chiếu.

Cuối cùng, điều đáng nói đến là có một số thông báo đáng chú ý ongoing research work về lập trình meta theo giai đoạn trong JavaScript.

Các vấn đề liên quan