Linux.org.ru
Новости - Галерея - Форум - Трекер - Wiki - Поиск
[#]  

[scheme][школота] макру бы надо

как написать макрос преобразующий символ типа com.foo.bar.xxx в выражение (getattr (getattr (getattr com 'foo) 'bar) 'xxx) ?

r5rs раздел про макросы неосилил, увы

anonymous (05.01.2009 23:30:39)

[#]  
Sphinx (фотография)

Enjoy your non-R6RS solution

(define (dotted->seq dotted-symbol)
  (map string->symbol
       (regexp-split #rx"\\." (symbol->string dotted-symbol))))

(define (seq->nested seq)
  (reduce (lambda (child object)
            `(getitem ,object ',child))
          '() seq))
Sphinx *** (06.01.2009 12:29:56)
[#] Ответ на: Enjoy your non-R6RS solution от Sphinx 06.01.2009 12:29:56  
Sphinx (фотография)

Re: Enjoy your non-R6RS solution

Гонять символ→строки→символы совершенно неспортивно. Наверное, лучше
изменить стандартный ридер так, чтобы он на лету считывал foo.bar.baz
в более удобную форму (то есть, заменить `dotted->seq` модификацией
ридера). Сделай сам :)

А причём тут макры?

Sphinx *** (06.01.2009 12:32:37)
[#]  

Re: [scheme][школота] макру бы надо

В рамках чистого R5RS это и невозможно сделать. Однако, в любой реализации Схемы, где есть православный define-macro, это делается элементарно - (define-macro (unroll-dots . rest) (your-function-that-unrolls-those-bloody-dots rest))

anonymous (08.01.2009 14:56:10)
[#] Ответ на: Re: Enjoy your non-R6RS solution от Sphinx 06.01.2009 12:32:37  

Re: Enjoy your non-R6RS solution

> Гонять символ→строки→символы совершенно неспортивно.

Это ещё почему? :-O

> А причём тут макры?

Ну так это, наверное, во время компиляции разворачивать человек хочет.

anonymous (08.01.2009 14:57:21)
[#] Ответ на: Re: Enjoy your non-R6RS solution от anonymous 08.01.2009 14:57:21  
Sphinx (фотография)

Re: Enjoy your non-R6RS solution

> Это ещё почему? :-O

Не знаю, мне почему-то так показалось. Так делают?

> your-function-that-unrolls-those-bloody-dots


Лол, я сперва начал это искать в RnRS :)

Sphinx *** (08.01.2009 17:42:19)
[#] Ответ на: Re: Enjoy your non-R6RS solution от Sphinx 08.01.2009 17:42:19  

Re: Enjoy your non-R6RS solution

> Не знаю, мне почему-то так показалось. Так делают?

Да, конечно же. Синтаксис S-выражений слишком убог, так что расширить его за счёт внутренностей символов - идея привлекательная.

Так даже инфиксную арифметику люди делают, например (infix I2*2+(I1+1))

Здесь I2*2+ и I1+1 - символы.

anonymous (08.01.2009 17:47:22)

О Сервере - Правила форума
http://www.linux.org.ru/

Rambler's Top100 TopList