LET
самостоятельно не реальный примитив в Язык Функционального программирования , так как он может замененный LAMBDA
. Как это:
(let ((a1 b1) (a2 b2) ... (an bn))
(some-code a1 a2 ... an))
подобно [1 122]
((lambda (a1 a2 ... an)
(some-code a1 a2 ... an))
b1 b2 ... bn)
, Но
(let* ((a1 b1) (a2 b2) ... (an bn))
(some-code a1 a2 ... an))
подобно [1 124]
((lambda (a1)
((lambda (a2)
...
((lambda (an)
(some-code a1 a2 ... an))
bn))
b2))
b1)
, можно вообразить, который является более простой вещью. LET
а не LET*
.
LET
делает код, понимающий легче. Каждый видит набор привязки, и можно считать каждую привязку индивидуально без потребности понять top-down/left-right поток 'эффектов' (повторные переплетения). Используя [1 110] сигналы программисту (тот, который читает код), что привязка весьма зависима, но существует некоторый нисходящий поток - который усложняет вещи.
язык Common LISP имеет правило, что значения для привязки в [1 111] вычисляются слева направо. Как значения для вызова функции оценены - слева направо. Так, LET
концептуально более простой оператор, и он должен использоваться по умолчанию.
Типы в [1 113] ? Используются довольно часто. Существуют некоторые примитивные формы описания типа, которые легко помнить. Пример:
(LOOP FOR i FIXNUM BELOW (TRUNCATE n 2) do (something i))
Выше объявляет, что переменная i
fixnum
.
Richard P. Gabriel опубликовал свою книгу по сравнительным тестам Lisp в 1985, и в то время эти сравнительные тесты также использовались с неCL, Шепелявит. Сам язык Common LISP был совершенно новым в 1985 - книга CLtL1, которая описала язык, был просто опубликован в 1984. Неудивительный реализации не были очень оптимизированы в то время. Реализованная оптимизация была в основном тем же (или меньше), который реализации прежде имели (как MacLisp).
, Но для [1 116] по сравнению с [1 117] основное различие - то, что код с помощью [1 118] легче понять для людей, так как обязательные пункты независимы друг от друга - тем более, что это - плохой стиль для использования в своих интересах левых к правильной оценке (не устанавливающий переменные как побочный эффект).
Да, регулярные выражения могут сделать это за вас:
"HelloWorldMyNameIsCarl".replaceAll("(.)([A-Z])", "$1_$2")
Выражение [AZ]
сопоставит все буквы верхнего регистра и поместит их во вторую группу. Вам нужна первая группа .
чтобы избежать замены первой буквы «H».
Как указал Piligrim , это решение не работает для произвольных языков. Чтобы поймать любую заглавную букву, определенную стандартным стандартом Unicode, нам понадобится подсвойство Unicode 4.1 \ p {Lu}
, которое соответствует всем заглавным буквам. Таким образом, более общее решение выглядит как
"HelloWorldMyNameIsCarl".replaceAll("(.)(\\p{Lu})", "$1_$2")
Спасибо, Пилигрим.
Это домашнее задание? Для начала:
java.lang.Character
) Вот подсказка, которая поможет вам обдумать возможное решение:
Полезные ключевые слова: