LINUX.ORG.RU

clisp и непонятный синтаксис


0

0

Решил, немного, just for fun посмотреть, что из себя представляет 
LISP. До этого с ФП ниразу не сталкивался. В "Practical CL" есть такой код:

(defun save-db (filename)
  (with-open-file (out filename
                   :direction :output
                   :if-exists :supersede)
    (with-standard-io-syntax
      (print *db* out))))

":direction :output :if-exists :supersede" -- являются передаваемыми 
параметрами для макроса, т.е. фактически они все равноранговые.
Непонятно, как пары параметров (!) задают конкретный функционал ~ 
direction=output и if-exists=supersede. Я бы понял, если бы это выглядело примерно так ~
(list :direction 'output :if-exists 'supersede')

Объясните, пожалуйста, вкратце про такую семантику передачи аргументов? Спасибо.
anonymous

Господа, перестаньте называть Common Lisp clisp'ом, не делайте неоднозначностей.

А по теме: далее в PCL будет рассказано про keyword parameters, я лишь приведу пример их определения:

(defun some-function (x &key (y 10))
 (+ x y))

CL-USER> (some-function 1 :y 5)
6
CL-USER> (some-function 1)
11

stassats ★★★★
()

1) cl не fp.
2) это не семантика, а синтаксис.
3) это всего лишь синтаксические издержки/пережитки. на семантику они не влияют, как и обилие syntactic sugar в cl.

asgard
()
Ответ на: комментарий от stassats

на сколько я понял, человек понимает, что такое keywords, его смущает передача кейворду кейворда в кач-ве значения:

как, например в этом случае (open s :direction :output :if-exists nil), передача кейворду :directional кейворда :output в кач-ве аргумента.

asgard
()
Ответ на: комментарий от anonymous

При том, что это ключевые параметры. Не пойму, что тебя смущает в том, что в качестве аргумента функции ты можешь передать что угодно, хоть саму функцию, хоть keyword.

stassats ★★★★
()
Ответ на: комментарий от stassats

> Хм, а что тут может быть смутительного?

вот это уже не у меня нужно спрашивать. =)

asgard
()
Ответ на: комментарий от stassats

Тот анонимус -- не я (всмысле, топикстартер) :).

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

// topicstarter

anonymous
()
Ответ на: комментарий от anonymous

Вполне читабельно в примере:

                   :direction :output
                   :if-exists :supersede

Тебя же никто не заставляет писать все в одну строку

stassats ★★★★
()
Ответ на: комментарий от asgard

>1) cl не fp.

А что тогда ФП по-твоему, кроме Хаскеля? CL - не ФП, Эрланг - не ФП, ... - задолбали. Некоторые говорят, что даже Питон и C++ - ФП, а вы тут гоните непонятно что. Тогда по-вашему вообще нет ФП языков, кроме одного.

ЗЫ: Официально признано, что LISP, Scheme, Clean, OCaml и Haskell - ФП. Erlang на границе.

anonymous
()
Ответ на: комментарий от anonymous

Официально признано --- очень интересно, и где же находится комитет по официальному признанию?

Common Lisp мультиперадигменный язык. Он столько же функционален, сколько и объектно-ориентированн, и императивен.

stassats ★★★★
()
Ответ на: комментарий от anonymous

> А что тогда ФП по-твоему, кроме Хаскеля?

самому википедию лень открыть?

> CL - не ФП, Эрланг - не ФП, ... - задолбали. Некоторые говорят, что даже Питон и C++ - ФП, а вы тут гоните непонятно что.

что такое мультипарадигмальные языки знаем?

> Официально признано, что LISP, Scheme, Clean, OCaml и Haskell - ФП.

различий между purely functional language и multiparadigm language не видим?

asgard
()
Ответ на: комментарий от asgard

Покажи хоть один однопарадигменный язык. Даже ассемблер - мультипарадигменный.

Единственный чисто функциональный язык - это:

"Иди работай, чтоб через неделю все было готово".

anonymous
()
Ответ на: комментарий от anonymous

> Покажи хоть один однопарадигменный язык

на вскидку: smalltalk, haskell

asgard
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.