Язык с похожим использованием объекта в Javascript / JSON - PullRequest
2 голосов
/ 12 января 2009

Недавно я работал над проектом, сфокусированным практически на клиентском веб-сайте. Очевидно, что Javascript используется интенсивно, и я использую jQuery поверх него, с которым, безусловно, приятно работать.

Одна из вещей, которая удивила меня в этом, это то, насколько мне нравится синтаксис объекта JSON и его использование в javascript (выделено jQuery, который использует его везде). для тех, кто не знаком с ним, рассмотрим этот краткий пример:

function add(params) {
    params.result(params.a, params.b);
}

add({
    a: 1,
    b: 2,
    result: function(value) {
        alert(value);
    }
});

Конечно, этот пример чрезвычайно надуманный, но он иллюстрирует основное использование. JSON описывает объект на лету, передаваемый в этом случае в качестве параметра функции, и даже определяет функцию внутри него для использования в качестве обратного вызова. Лично я нахожу эту методологию очень простой в использовании, понимании и создании API-интерфейсов (хотя я знаю, что есть такие, которые не согласятся со мной).

Итак, мой вопрос, является ли этот тип синтаксиса уникальным для javascript? Я знаю, что многие языки имеют анализаторы JSON (и использовали несколько), но они не допускают такого встроенного объявления. И, разумеется, многое из того, что вы можете сделать с помощью этого синтаксиса, может быть продублировано с помощью именованных параметров в различных языках и лямбда-выражений или указателей на функции (Python запоминается), но я все еще не нахожу это столь элегантным.

Просто любопытно, спасибо за любые ответы!

Ответы [ 5 ]

3 голосов
/ 12 января 2009

Каноническим примером является Лисп: в Лиспе язык даже не определяется в терминах текста, он определяется в терминах структур данных. На самом деле нет никакой разницы между кодом и данными: код - это просто список, первый элемент которого интерпретируется как операция, а остальные как операнды.

Написание программы - это просто написание списков.

1 голос
/ 17 мая 2009

Синтаксис JSON очень похож на Perl-определение сложных структур. И ваш пример будет:

#!/usr/bin/perl

use strict;
use warnings;
use signatures;
sub add($hash) {
    $hash->{result}($hash->{a}, $hash->{b});
}

add({
    a=> 1,
    b=> 2,
    result=> sub ($val) {
        print "$val\n";
    }
});
1 голос
/ 12 января 2009

Lua использует «таблицы», которые в значительной степени идентичны объектам javascript.

0 голосов
/ 12 января 2009

Рубисты будут делать:

def add(params) {
    params.result(params.a, params.b)
}

add({:a=> 1, :b=> 2}) do |value|
    alert(value)
end

Передача необязательного блока - странная идиома в ruby. Или быть более верным вашему примеру.

def add(params) {
    params.result(params.a, params.b)
}

add({
    :a=> 1, 
    :b=> 2,
    :result=> proc do |value|
        alert(value)
    end
})

Но понятие встроенной функции происходит от лямбда-исчисления и LISP.

0 голосов
/ 12 января 2009

C # 3.0 имеет нечто похожее в том, что вы можете создать экземпляр объекта, используя конструктор по умолчанию, и назначить свойства в одном и том же операторе. Это на самом деле просто немного синтаксического сахара, но это действительно делает его намного проще, чем объявление нескольких конструкторов, просто для обработки различных комбинаций настроек параметров. Похоже:

 var myObject = new MyClass { Property1 = "value", NumericProperty = 1 };

В C # 3.0 также есть анонимные типы, имеющие сходный синтаксис; они часто используются с LINQ

 var query = dataContext.Entity
                        .Where( e => e.Kind = 1 )
                        .Select( e => new { e.Name, e.Kind } );

В результате получается IEnumerable нового анонимного типа со свойствами «Имя» и «Вид», которые, в свою очередь, имеют те же типы, что и соответствующие свойства сущности.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...