Size: a a a

Scheme — русскоязычное сообщество

2021 August 21

y

yosk in Scheme — русскоязычное сообщество
Как оказалось я просто затупил и match проглатывал (car rule) не эваля. Соответственно в (cdr rule), который уже эвалился, был уже другой rule.
источник

y

yosk in Scheme — русскоязычное сообщество
Я хочу каким-то образом мапаться макросом по списку, но при этом макрос раскрывается по разному в зависимости от своих аргументов. То есть код вроде такого работать не будет:

(map (lambda (arg) (some-macro arg))
    '(arg1 arg2 arg3))

Макрос библиотечный, и переписывать его на что-то свое мне бы не хотелось (это и не во всех случаях получится). Случай наверное не особо редкий, как с этим обычно справляются?
источник

y

yosk in Scheme — русскоязычное сообщество
Есть вариант написать свой макрос, который будет аналогом map и из-за раскрытия до выполнения кода другие макросы будут нормально работать. Но это звучит как не очень хорошая идея, мне кажется какой-то код может сломаться.
источник

A ß in Scheme — русскоязычное сообщество
1) mapcar
2) стоит посмотреть на macroexp
источник

y

yosk in Scheme — русскоязычное сообщество
А это все в схеме есть? Первое только во всяких CL-like (и по сути является аналогом схемного map), а второе только в elisp.
источник

y

yosk in Scheme — русскоязычное сообщество
Вообще я поискал, нашел следующие вещи:
Тут предлагают написать свой map для макросов.
https://stackoverflow.com/questions/2640040/how-do-i-map-a-macro-across-a-list-in-scheme
А это даже не схема и не Guile и к сожалению похоже мертво.
https://web.cs.wpi.edu/~jshutt/kernel.html
источник

AZ

Aydar Zarifullin in Scheme — русскоязычное сообщество
Тут наверное нельзя без своей версии map обойтись, попробуй адаптировать решение с SO для guile. Если я правильно понимаю новый map обязательно должен быть макросом.
источник

A ß in Scheme — русскоязычное сообщество
сорян, я думал это чатик по емаксу и ответил елиспово
источник
2021 August 22

DP

Dmitry Popov in Scheme — русскоязычное сообщество
В рэкете я пишу:

(define-syntax-rule (triple x) '(x x x))
(define-syntax-rule (mmap f xs ...) (list (f xs) ...))

тогда

> (mmap triple 1 2 3)
'((1 1 1) (2 2 2) (3 3 3))

Но я не помню, эти троеточия есть в обычной схеме или это рэкетовая фишка.
источник

DP

Dmitry Popov in Scheme — русскоязычное сообщество
Ellipsis Patterns зовется
источник

A ß in Scheme — русскоязычное сообщество
есть
источник
2021 August 24

VK

Vadim Komarov in Scheme — русскоязычное сообщество
Чат, подскажите как в рэкете принято с вложенными хэшмапами работать.
Есть json'ка, например следующего вида:
{"foo": {"bar": {"pupa": {"lupa": 3}}}}

Она где-то преобразуется в хэшмап, откуда нужно достать Лупу.

Писать (hash-ref (hash-ref (hash-ref (hash-ref h 'foo) 'bar) 'pupa) 'lupa) выглядит не оч. весело.

Я сейчас сделал вот такой макрос, который раскрывается в код выше, но не уверен в своем решении.
(define-syntax (hash-ref* stx)
 (syntax-case stx ()
   [(_ hsh [k1]) #'(hash-ref hsh k1)]
   [(_ hsh [k1] f) #'(hash-ref hsh k1 f)]
   [(_ hsh [k1 k2 ...]) #'(hash-ref* (hash-ref hsh k1) [k2 ...])]
   [(_ hsh [k1 k2 ...] f) #'(hash-ref* (hash-ref hsh k1 #hasheq()) [k2 ...] f)]))


> (hash-ref* h ['foo 'bar 'pupa 'lupa] "")
3


Может, существует другой путь, более идиоматичный?
источник

VK

Vadim Komarov in Scheme — русскоязычное сообщество
В кложуре есть get-in, может имеется его аналог?
источник

b⛅

bouncepaw ⛅ in Scheme — русскоязычное сообщество
источник

VK

Vadim Komarov in Scheme — русскоязычное сообщество
Да, видел его (и ещё есть https://docs.racket-lang.org/nested-hash/index.html)

Мне казалось, задача достаточно распространенная, чтобы было стандартное решение.

lenses выглядят прям overkill, у меня весь код меньше 200 строк, не хочется тащить зависимость.

Но всё равно спасибо! Оставлю макрос тогда)
источник

b⛅

bouncepaw ⛅ in Scheme — русскоязычное сообщество
Нестед-хеш выглядит хорошо
источник
2021 August 29

ND

Nikita Domnickij in Scheme — русскоязычное сообщество
а как красиво получить строку из n одинаковых символов?
источник

A ß in Scheme — русскоязычное сообщество
make-string?
источник

ND

Nikita Domnickij in Scheme — русскоязычное сообщество
ага, спасибо
источник

ND

Nikita Domnickij in Scheme — русскоязычное сообщество
а есть способ отличить алист от простого листа?
источник