LINUX.ORG.RU

самодельный минилисп

 


0

4

нарисовал себе самодельный минилисп -

переделал лисповые имена на приличные, чтоб хоть конвенциальным процедурным программистом читалось

пример тест файла

(module TestModule)
(import Module1 Module2 Module3)

(fun TITLE(ftext)
	(comment "print title title")
	(fun line()	(println "\n#####################################"))
	(line)(print ftext)(line) )

(TITLE "BEGIN TESTS")

(fun print_mem () (println "mem used " (mem-used) " bytes"))

(print_mem)

;;//======================================
(fun print_sym_count () 
	(println "Sybols count: " (list-length ^Symbols)))

(fun print_symbols()
	(comment "print registered symbols")
	(println "Registered Symbols ======\n"
				(symbols)
				"\n ======= end of symbols")
	(print_sym_count))
	
(print_symbols); ///print predefined symbols
(print_sym_count)

;;//===========================

(println (not t) "not t")
(println (not ()) "not ()")

;;(halt)

;;//================================
;; /// operators
(define _ " ")
(fun ++ (fval) (inc fval))
(fun -- (fval) (dec fval))

;;///arithmetic shift 

;;================================
(enum MyEnum (a1 . "abs") (a2 . "ddd") (a3 . "test") )
(enum MyEnum1 (a1 . 10) (a2 . 20) (a3 . 30) )

;;//(var i MyEnum1 [a1] )

(class TestClass
	(var x 0)
	(var y 0)
	(var z 0)
	
	(var 
		(a int 0) 
		(b int 0) 
		(c int 0)
	)
	 
	(fun print_() ( print x y z))
	(override fff() 100)
	(ctor () ())
	(ctor (fint) (setq x fint))
)

(const t 100)

;//================================
(fun read(fstream) (println "read go") 0)
(fun write(fstream) 1)
(read 100)

;//================================
(var xx 10)
(println "test increment: ++10 is:" (++ xx))

;//=================================
(fun sqr(x) (* x x)) 
(println "sqr of 7 = " (sqr 7))

(var 	yy 16)  (println "shr 16 = " (shr yy))
(setq yy 16)  (println "shl 16 = " (shl yy))

(var _name0 "sidor")
(var _name1 "sidorov")
(println (+ "author: " _name0 _ _name1))
(var lline (+ "new author: " _name0 _ _name1))
(println lline)
(println "a" _ "b" _ "c")

;//==================================
(fun check (fexpr ftext) (	println ftext ":" fexpr) )

(fun assert(fbool ftext)(
	if (not fbool) (println ftext)))

(fun check_lambda ()
	(var llx (lambda () (print "it is lambda!!!")))
	(llx)
)
	
(check_lambda)	

(assert (< 100 1) "assert works!!!")

(check (< 11 10) "must be false")
(check (> 11 10) "must be true")
(check (eq _name0 "vova") "must be true")

;//===================================
(fun test_loop (flim)
	(var li flim) (while (> li 0) (print li " ") (dec li))
	;;(var i 0) (while (< i flim) (print i " ") (inc i))
)

(fun do_test (fname ftestfun)
	(println fname) ftestfun)

(do_test "SOME_TEST: "  (test_loop 10) )
;(do_test "SOME_TEST: " ())

(fun check_order ()
	(comment "check order")
	(print "test_order: ")
	(print "1 ")(print "2 ")(print "3 \n"))

(check_order)

(println "test 1") (test_loop 5)
(println "test 2") (test_loop 3)
;//===================================

;;(print_symbols)
(TITLE " END TESTS")

(print_mem) 
(check (garbage-collect) "garbage collect") 
(print_mem)

(print "\nenter char to exit >") (getchar)
;;//(print "\nenter char to exit >") (getchar)

★★★

Ответ на: комментарий от monk

цель - сделать лиспоподобный читабельный микроязычок, для скриптов. не не более 5 тыщ строк в реализации. счас тыщи полторы, две.

поскольку я вообще-то компиляторостроитель, но для языков процедурных, - попробовать некоторые идеи оттуда, - сократить количество мусора внедрением процедурного стека, сделать читабельные классы(без классов я вообще не могу).

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

сейчас все реализовано на Си. но я плюсовик, и прям тянет в плюсы переписать.

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

для языков процедурных, - попробовать некоторые идеи оттуда, - сократить количество мусора внедрением процедурного стека, сделать читабельные классы(без классов я вообще не могу).

Будет лучше, чем Lily?

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

Больше похоже на Паскаль с лисповским синтаксисом.

ну я просто ввел тавтологии defun == fun, define == var, классические символы никуда не делись. тут просто вопрос привычки.

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

ну еще и типизацию красиво сформулировать. следы этого тоже есть в примере.

и модули. следы тоже есть

alysnix ★★★
() автор топика
Последнее исправление: alysnix (всего исправлений: 2)
Ответ на: комментарий от firkax

чем он полезней этой темы?

Тем, что там много таких вещей, которых никогда не было (и скорее всего не будет) в С++. А вещи интересные, позволяющие взглянуть на проблемы под другим углом, что всегда полезно. Вообще, расширение кругозора всегда полезно, а всю жизнь плавать в своём болоте (С++) не выныривая - не полезно.

К тому же, сколько ни было попыток сделать лисп более лучше, все провалились. Ибо лисп идеален!

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

К тому же, сколько ни было попыток сделать лисп более лучше, все провалились. Ибо лисп идеален!

Какой именно лисп? Живы сейчас, как минимум, Common Lisp, Picolisp, Racket и Clojure. Для меня идеален Racket, но для других людей другие диалекты.

monk ★★★★★
()

Лисп — офигенный язык. Но для своего класса задач — обработки списков и, в меньшей степени, преобразования языков (макросы, вот это все). То, что ты предложил в ОП — это какая-то процедурная плохо читаемая портянка, которая выглядела бы кратно лучше на нормальном процедурном языке с синтаксисом.

То есть, если ты можешь органично свести задачу скриптования своей программы к обработке списков, написание скриптов будет в кайф. В противном случае лучше возьми lua.

filosofia
()
Последнее исправление: filosofia (всего исправлений: 1)
Ответ на: комментарий от alysnix

там вроде ссылка на документацию мертвая

Наверное, из-за этого:

This release is important for two reasons: One, that Lily turns 10 today. Two, that I am taking an indefinite hiatus from this project. I’m incredibly proud of what I’ve made, but I want to shift my focus to other, smaller projects.

Но это не отменяет его/её полезности. :)

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

Но для своего класса задач — обработки списков

Это разве что Picolisp. В остальных лиспах основной тип данных структура, а не список.

в меньшей степени, преобразования языков (макросы, вот это все)

Это да. Но макросы в лиспах обычно пишутся в библиотеках для синтаксического сахара. В Racket без макроса можно сделать практически всё, что можно сделать макросом.

У лиспов есть удобство передачи функций и замыканий в параметры. Собственно, именно поэтому лиспам не особо нужны классы в их классическом виде: объект в виде данных и методов доступа к этим данным тривиально реализуется через замыкание.

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

R7RS. Racket хорош, но я столкнулся с одной проблемой, которую не смог решить простыми методами. Задавал вопрос в группе по схеме, но мне не ответили:

Товарищи, может кто-то подсказать по Places в Racket? Хочу сделать thread-pool из плейсов, но не получается сделать поллинг каналов и удаление «мётрвых» плейсов. Точнее, поллинг делается через sync, то он возвращает сообщение, а не плейс, по этому я не могу удалить отработавший плейс из списка. А функции, которая бы показывала для плейса состояние (жив/мертв) я не нашёл

Там ещё что-то было с контекстом выполнения плейса, т.к. была задача подгрузить код из файла и выполнить.

В итоге переписал всё на Guile.

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

Так идеал - это идеально воплощение неких идей.

Для RAII, zero-cost, SFINAE, UB именно C++ является их идеальным воплощением. Как Scheme (и все лиспы после неё) является идеальным воплощением идеи замыкания, а сама схеме ещё и идеальным воплощением идеи продолжений.

тришкин кафтан ну никак на идеал не тянет

Всё тришкин кафтан. SBCL ломается на сложных типах. Haskell имеет кошмарное метапрограммирование, Racket вообще втянул в себя все идеи, которые возможны.

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

К тому же, сколько ни было попыток сделать лисп более лучше, все провалились. Ибо лисп идеален!

R7RS

Из одного названия понятно, что это, как минимум, седьмая успешная попытка сделать лисп лучше. :-)

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

Из одного названия понятно, что это, как минимум, седьмая успешная попытка сделать лисп лучше. :-)

Ну так, нет предела совершенству :) Но R7RS - это в какой-то степени революционная попытка, ты же сам знаешь.

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

типа Java, C# или что-то подобное.

А что там уникального?

ООП этого типа лучше на C++ смотреть, а в более широком смысле на лиспе. Сборщик мусора и отсутствие UB - в списке Haskell и лисп. Что там ещё есть?

На них зарабатывать можно, но изучать там нечего.

monk ★★★★★
()