LINUX.ORG.RU

Избранные сообщения monk

Реализация рестартов из Common Lisp в C++

Форум — Development

https://github.com/BerserkerTroll/restart-pp

Пример использования:


#include "restartable.h"
#include <iostream>
#include <cmath>
using namespace std;


struct bad_my_sqrt_parameter { double param; }; // condition

struct my_sqrt_use_value { double val; }; // restart
struct my_sqrt_recalculate { double val; }; // restart


double my_sqrt(double d)
{
	if (d < 0)
		restartable {
			signal_condition bad_my_sqrt_parameter{ d };
		} restart_case (my_sqrt_use_value& v) {
			return v.val;
		} restart_case (my_sqrt_recalculate& v) {
			return my_sqrt(v.val);
		};

	return sqrt(d);
}


int main()
{
	with_handlers {
		cout << my_sqrt(+4) << endl;
		cout << my_sqrt(-4) << endl;
	} handler_bind (bad_my_sqrt_parameter&) {
		invoke_restart my_sqrt_use_value{ -1 };
	};

	with_handlers {
		cout << my_sqrt(+4) << endl;
		cout << my_sqrt(-4) << endl;
	} handler_bind (bad_my_sqrt_parameter& p) {
		invoke_restart my_sqrt_recalculate { -p.param };
	};
}

 ,

Oxdeadbeef ()

Как на макросах изобразить инстанциирование

Форум — Development

Есть макрос, который должен создавать функцию.

(defmacro build (info) `(lambda ...))

Текст функции зависит от содержимого структуры info.

Где-то в коде он многократно вызывается с разными параметрами. Можно ли как-то сделать, чтобы он при первом запуске где-то создавал функцию, а при последующих только ссылался на неё? То есть нужен механизм, аналогичный инстанциированию шаблонов C++.

Есть какие-нибудь идеи, как сделать? Реализация лиспа (CL, Scheme, ...) не важна.

 , ,

monk ()

А как у common lisp дела с производительностью?

Форум — Development

Решил покурить cl ,не ну реально красивый язык. Учить решил по книге Practical Common Lisp (может посоветуете что ещё?), а запускать код на clisp. Ну так вот какие реализации языка предпочесть? Касаемо книг хотелось бы что то типа k&r, в такой же манере, но для common lisp, ну вы поняли.

Ну и вообще что посоветуете начинающему лисперу?

 

Dron ()

Макросы для нескольких S-expressions

Форум — Development

Интересует вопрос, можно ли в диалектах Lisp писать макросы, которые преобразуют не один S-expression, находя его по первому элементу списка, а позволяют указать более сложный шаблон, по которому искать дерево для трансформации?

Чтобы было понятнее, пример на псевдоязыке:

(defmacro (swap-begin _* :as contents swap-end)
  (reverse contents))

Такой макрос по задумке должен выдать все S-exp между swap-begin и swap-end в обратном порядке:

=> (macroexpand '(swap-begin (+ 1 2) (println "whatever") (/ 2 1) swap-end))
((/ 2 1) (println "whatever") (+ 1 2))

Извиняюсь, если получилось немного сумбурно; надеюсь, общая идея понятна.

У самого есть подозрение, что нужно глубже гуглить по словам reader macro или code walking, но не уверен (я пока только начинаю знакомиться с Lisp).

runtime ()

Более лучший Лисп

Форум — Talks

Что бы вы изменили и каким образом в своем любимом/нелюбимом диалекте Лиспа, чтобы он стал ещё лучше? Расскажите обо всех своих грязных фантазиях.

Лиспосрач (и те два унылых анонимуса) не приветствуется.

Перемещено tazhate из development

 

y-combinator ()