Действительно ли XSLT является языком функционального программирования?

Когда вы объявляете ссылочную переменную (т. е. объект), вы действительно создаете указатель на объект. Рассмотрим следующий код, в котором вы объявляете переменную примитивного типа int:

int x;
x = 10;

В этом примере переменная x является int, и Java инициализирует ее для 0. Когда вы назначаете его 10 во второй строке, ваше значение 10 записывается в ячейку памяти, на которую указывает x.

Но когда вы пытаетесь объявить ссылочный тип, произойдет что-то другое. Возьмите следующий код:

Integer num;
num = new Integer(10);

Первая строка объявляет переменную с именем num, но она не содержит примитивного значения. Вместо этого он содержит указатель (потому что тип Integer является ссылочным типом). Поскольку вы еще не указали, что указать на Java, он устанавливает значение null, что означает «Я ничего не указываю».

Во второй строке ключевое слово new используется для создания экземпляра (или создания ) объекту типа Integer и переменной указателя num присваивается этот объект. Теперь вы можете ссылаться на объект, используя оператор разыменования . (точка).

Exception, о котором вы просили, возникает, когда вы объявляете переменную, но не создавали объект. Если вы попытаетесь разыменовать num. Перед созданием объекта вы получите NullPointerException. В самых тривиальных случаях компилятор поймает проблему и сообщит вам, что «num не может быть инициализирован», но иногда вы пишете код, который непосредственно не создает объект.

Например, вы можете имеют следующий метод:

public void doSomething(SomeObject obj) {
   //do something to obj
}

В этом случае вы не создаете объект obj, скорее предполагая, что он был создан до вызова метода doSomething. К сожалению, этот метод можно вызвать следующим образом:

doSomething(null);

В этом случае obj имеет значение null. Если метод предназначен для того, чтобы что-то сделать для переданного объекта, целесообразно бросить NullPointerException, потому что это ошибка программиста, и программисту понадобится эта информация для целей отладки.

Альтернативно, там могут быть случаи, когда цель метода заключается не только в том, чтобы работать с переданным в объекте, и поэтому нулевой параметр может быть приемлемым. В этом случае вам нужно будет проверить нулевой параметр и вести себя по-другому. Вы также должны объяснить это в документации. Например, doSomething может быть записано как:

/**
  * @param obj An optional foo for ____. May be null, in which case 
  *  the result will be ____.
  */
public void doSomething(SomeObject obj) {
    if(obj != null) {
       //do something
    } else {
       //do something else
    }
}

Наконец, Как определить исключение & amp; причина использования Трассировки стека

23
задан Dimitre Novatchev 18 December 2010 в 21:05
поделиться

6 ответов

XSLT декларативен в противоположность с сохранением информации.

, Хотя XSLT основан на идеях функционального программирования, это не полный язык функционального программирования, это испытывает недостаток в способности рассматривать функции как тип данных первого класса. Это имеет элементы как отложенные вычисления для сокращения ненужной оценки и также отсутствия явных циклов.

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

От Википедия на XSLT:

Как язык, XSLT под влиянием функциональных языков, и основанными на тексте языками сопоставления с образцом как SNOBOL и awk. Его самый прямой предшественник был DSSSL, языком, который выполнил ту же функцию для SGML, который XSLT выполняет для XML. XSLT можно также рассмотреть как шаблонный процессор.

Вот большой сайт на использовании XSLT как функциональный язык с помощью FXSL. FXSL является библиотекой, которая реализует поддержку функций высшего порядка.

из-за FXSL я не думаю, что XSLT имеет потребность быть полностью функциональным саму. Возможно, FXSL будет включен как стандарт W3C в будущем, но у меня нет доказательства этого.

29
ответ дан Brian R. Bondy 29 November 2019 в 01:33
поделиться

Я уверен Вы, парни нашли эту ссылку к настоящему времени :-) http://fxsl.sourceforge.net/articles/FuncProg/Functional%20Programming.html .

Хорошо функции в XSLT являются гражданами первого класса с некоторой работой arounds, в конце концов, :-)

7
ответ дан 29 November 2019 в 01:33
поделиться

Это то, что я чувствую, когда программирую.

XSLT полностью основан на определении функций и применении их к выбранным событиям, поступающим во входной поток.

XSLT позволяет вам установить переменную. Функциональное программирование не позволяет функциям иметь побочные эффекты - и это важная вещь.

Тем не менее, при написании в XSLT ощущается то же самое, что и при работе в режиме FP. Вы работаете с вводом, а не изменяете его для создания вывода.

Это очень, очень Модель программирования отличается от используемой при работе с DOM API. DOM вообще не разделяет ввод и вывод. Вам передается структура данных - и вы манипулируете ею так, как считаете нужным - без колебаний, ограничений или угрызений совести.

Достаточно сказать, что если вам нравится FP и принципы, лежащие в его основе, вы, вероятно, будете чувствовать себя комфортно, работая с ним. Так же, как и опыт с программированием, управляемым событиями, и самим XML, вам это тоже будет удобно.

Если ваш единственный опыт работы с нисходящими программами, не зависящими от событий, - тогда XSLT будет очень незнакомым, действительно чуждым ландшафтом. По крайней мере, на первых порах. Получите немного опыта, а затем вернетесь к XSLT, когда выражения XPath и события - обработка действительно удобна для вас, и вы окупитесь щедро.

6
ответ дан JohnnySoftware 29 November 2019 в 01:33
поделиться

По большей части, что делает XSLT не, 100%-й язык функционального программирования, это - неспособность рассматривать функции как первоклассный тип данных.

могут быть некоторые другие - но это - очевидный ответ.

Удачи!

5
ответ дан Ian P 29 November 2019 в 01:33
поделиться

Саксонский SA представил некоторые дополнительные функции, которые делают XSLT функциональный. Можно использовать saxon:function() для создавания стоимости функции (на самом деле {http://net.sf.saxon/java-type}net.sf.saxon.expr.UserFunctionCall значение), который Вы тогда называете с saxon:call().

у сакса-B есть схожая функциональность с соединением [1 110] saxon:expression() и saxon:eval(). Различие - то, что saxon:expression() берет любое выражение XPath, и saxon:eval() оценивает его, тогда как saxon:function() берет название функции который saxon:call() вызовы.

4
ответ дан JeniT 29 November 2019 в 01:33
поделиться

Это не действительно аргумент, так как можно только объявить переменные, не изменить их значения после объявления. В этом смысле это декларативно не обязательный стиль, как указано в статье г-на Novatchev.

языки Функционального программирования как Scheme или Erlang позволяют Вам объявить переменные также, и в Haskell можно также сделать это:

- функция 'тест' берет переменную x и добавляет его на каждом элементе xs

test :: [Int] -> [Int]
test xs = map (+ x) xs
where x = 2
списка
0
ответ дан l--''''''---------'''''''''''' 29 November 2019 в 01:33
поделиться
Другие вопросы по тегам:

Похожие вопросы: