LINUX.ORG.RU

erlang scheme


0

1

Всем привет.

Давно хотел взяться за ф-ое программирование. Пару раз пробовал lisp, но как-то не пошло. А потом наткнулся на erlang и мне понравилось. Там всё как-то полегче объясняется.

Сейчас читаю sicp, а там scheme. Ну, в общем, начал про scheme читать и вот у меня такой вопрос:

Допустим у меня такой итеративный факториалокод на erlang:

fact(B) ->
   i_fact(B, 1).

i_fact(0, A) ->
   A; 
i_fact(B, A) ->
   i_fact(B-1, A*B).

на scheme:

(define (i_fact b a)
     (if (= b 0)
         a
         (i_fact (- b 1) (* a b))))

(define (fact b)
     (i_fact b 1))

Можно ли избавится от if в scheme, что б так же как в erlang конкретный clause (или как он там называется, я не уверен, что правильно) выбирался автоматом, а то как то громоздко получается.

Спасибо.

★★★★

Последнее исправление: nanoolinux (всего исправлений: 1)

В ерланге pattern-matching, заимствованный из пролога.

Вроде ближайший аналог в схеме - cond, в данном случае тот же «if», только вид сбоку. Так что скорее нет.

anonymous
()

В лиспе есть cl-match, может и для схемы такое же прикрутили. В любом случае это можно сделать, но не нужно.

ugoday ★★★★★
()

Сейчас читаю сисп, а там шема.

Хотеть развидеть это!

buddhist ★★★★★
()

шема = ским, лол

anonymous
()

Сейчас читаю ЛОР, а там Шома

lazyklimm ★★★★★
()

Можно ли избавится от if

Можно, но это почти то же самое, что в сишечке поменять фигурные скобки на begin и end.

buddhist ★★★★★
()

Можно ли избавится от if в шеме, что б так же как в ерланге конкретный clause (или как он там называется, я не уверен, что правильно) выбирался автоматом, а то как то громоздко получается.

А зачем?

Да, Емнип, в хаскеле можно. Изучай хацкель

anonymous
()

А не кажется ли вам странным, что в девелопменте пошла какая-то хрень

Вместо реальных задач идет какая-то дребедень, типа какие скобочки кавайней?

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

Да, Емнип, в хаскеле можно. Изучай хацкель

Ага, именно вкупе с SICP-ом...

anonymous
()

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

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

вопрос в том, сопоставление с образцом встроенное или на уровне библиотек

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

Да, Емнип, в хаскеле можно. Изучай хацкель

Зачем нужен хаскиль, если есть макросы?

#lang racket
(require syntax/parse/define)

(begin-for-syntax
  (define-syntax-class match-clause
    (pattern [patt ...+ (~datum ->) (~peek-not (~seq _ (~datum =) _ ...)) body:expr ...+]
             #:with (expr ...) #'(body ...))
    (pattern [patt ...+ (~datum ->) (~seq guard (~datum =) (~seq guard-body:expr (~peek-not (~datum =))) ...+) ...+]
             #:with (expr ...) #'((cond [guard guard-body ...] ...)))))

(define-simple-macro (def name:id (~and (~not pre:match-clause) pre) ... clause:match-clause ...+)
  (define name (let () pre ... (match-lambda** [(clause.patt ...) clause.expr ...] ...))))



(def fac
  [def rec
    [acc 0 -> acc]
    [acc n -> (rec (* acc n) (sub1 n))]]
  
  [n -> (rec 1 n)])

(def fac2
  [n -> 
     (= n 0) = 0
     else    = (* n (fac (sub1 n)))])
anonymous
()
Ответ на: комментарий от anonymous

Мимо кассы, ракетчики уверяют, что не схема.

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

Вот я всегда думал, почему в схеме такая сложная система макросов. Надо бы почитать что про неё. А по возможностям она чем-то превосходит Common Lisp?

Ведь в последнем вся соль просто в #'gensym, ну и backquote помогает - пример хорошего синтаксического сахар

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

Вот я всегда думал, почему в схеме такая сложная система макросов.

Очевидно за тем, чтобы макросы было писать проще.

А по возможностям она чем-то превосходит Common Lisp?

Конечно.

#'gensym, ну и backquote

Кривые костыли.

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