2014-09-18 8 views
0

Я только начал изучать Lisp и у меня возникли проблемы с пониманием того, что this code from Rosetta Code говорит:Треугольник Паскаля в Лиспе

 
(defun pascal (n) 
    (genrow n '(1))) 

(defun genrow (n l) 
    (when (< 0 n) //is the command "when" something like if in Java? 
     (print l) 
     (genrow (1- n) (cons 1 (newrow l))))) 

(defun newrow (l) 
    (if (> 2 (length l)) 
     '(1) 
     (cons (+ (car l) (cadr l)) (newrow (cdr l))))) 

Я смотрел на некоторых веб-сайтах о лепет, но он по-прежнему запутанным. Единственным языком программирования, который я знаю, является Java. Если кто-то может объяснить на Java, что говорят смелые части, я был бы благодарен.

ответ

2

Lisp использует префиксную нотацию, поскольку в Lisp рассматриваются функции, которые обычно являются операторами (т.е. +, -,>) на других языках. (+ 1 1) в Lisp эквивалентно 1 + 1; на Java. Вы могли бы подумать об этом как о вызове функции добавления с 1 и 1 в качестве аргументов: add(1, 1) Это просто привыкает.

Так (> 2 (length l)) эквивалентно в 2 > length(l)

' в '(1) говорит Lisp для лечения, что следует как литерал. Поэтому вместо Lisp, ищущего функцию с именем 1 (это то, что произойдет без обратного хода), он возвращает список, содержащий 1 в качестве элемента. Эквивалентный способ сказать, что в Lisp: (quote (1)), который возвращает литеральный список, содержащий 1.

+0

Итак, когда я вызываю метод genrow, я передаю n и список? – Miley

+0

Точно. Я просто видел, что вы спрашивали о «когда». Функция 'when' (на самом деле макрос) похожа на инструкцию' if' в Java. Разница в том, что в Lisp нормальная функция 'if' имеет только одно выражение« then », за которым следует инструкция« else ». Макрос 'when' позволяет использовать несколько« then »операторов. Подробнее см. [This] (http://www.gnu.org/software/emacs/manual/html_node/elisp/Conditionals.html). – nonex

+0

Большое вам спасибо за помощь: D – Miley