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)

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

Haskell - идеальный типизированный язык. Но не все задачи ложатся на систему типов.

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

В Racket и схема есть

Это не спортивно. Схема поверх Racket поверх Схемы.

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

Это всё лучше в лиспе.

В лиспе можно писать не ООП, а в яве нельзя. И исключения по-другому используются.

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

В лиспе можно писать не ООП, а в яве нельзя.

Да легко:

public static int plus(int x, int y);

Это не ООП функция. Можно всю программу внутри одного класса в таком стиле написать.

И исключения по-другому используются.

В чём разница между

try {
   s = reader.readLine();
} catch (IOException e) {
   System.out.println(e.getMessage());
} finally {
   reader.close();
}

и

(unwind-protect
  (handler-case
    (setf s (read-line reader))
    (io-exception (e)
      (print (get-message e))))
  (close reader))

?

При этом возможности Common Lisp шире. Там все значения объекты с классамми.

* (class-of #'+)
#<SB-PCL:SYSTEM-CLASS COMMON-LISP:FUNCTION>
* (class-of t)
#<BUILT-IN-CLASS COMMON-LISP:SYMBOL>
* (class-of 1.5)
#<BUILT-IN-CLASS COMMON-LISP:SINGLE-FLOAT>

В яве вещественные числа не объекты.

Там есть множественная диспетчеризация и по значению элемента, в яве только по первому элементу и только по его классу.

И исключения тоже шире. Помимо полного аналога try/catch/finally есть restart-case/handler-bind и throw/catch.

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

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

Надо было на плюсах и писать. Было бы ещё короче. Есть задачи, где чистый си имеет свои преимущества, но разве здесь этот случай?

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

Это идея интересная, но никто не поймёт о чём речь. Я уже говорил в другой теме, что почему-то обучение созданию языков программирования начинают с синтаксических анализаторов, БНФ и тому подобное. На самом же деле этим надо заканчивать.

Намного более полезным может быть написание кода преобразования S-выражений (или аналогов) в байт-код, разработка логики этого байт-кода. Тут уже можно упражняться в скорости трансляции, в скорости выполнения, в потреблении памяти и т.д.

Может ты что-то и выдумал интересное, но показываешь только синтаксис, вызывая какие-то неверные ассоциации у других участников форума. Они думают, что ты им лисп принёс, а это на самом деле что-то типа раста с динамической типизацией.

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

вопрос к знатокам. а легально ли в лиспе, что s-выражение меняет само себя в процессе вычисления? если да, то вопрос - когда заканчивается его вычисление. если нет, то значит вычисление делается однократно от начала до конца списка невзирая ни на что.

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

Я не знаток и для меня вопрос звучит так: есть ли в лиспе макросы? Да, есть, лисперы их часто нахваливают. Но как они работают на уровне интерпретатора - не знаю, никогда не копал. Да и вообще, я лисп не использую.

Не уверен, что на ЛОР-е есть такие знатоки. Буду приятно удивлён, если ошибаюсь.

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

вопрос к знатокам. а легально ли в лиспе, что s-выражение меняет само себя в процессе вычисления? если да, то вопрос - когда заканчивается его вычисление. если нет, то значит вычисление делается однократно от начала до конца списка невзирая ни на что.

Макросы так работают.

На уровне псевдокода это так:

обработка-выражения выражение =
  если
    (не список?(выражение))
      выражение
    макрос?(первый-элемент выражение)
      обработка-выражения (применить (первый-элемент выражение) выражение)
    функция?(первый-элемент выражение)
      отобразить-список обработка-выражения выражение
    иначе выражение

то есть, если голова списка макрос, то выполняем его, пока результат не перестаёт быть формой макроса. Потом, если это функция, то проходим по всем элементам списка и также раскрываем макросы.

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

Да легко:

Можно извратиться, но дальше хеловорлда будет сложновато.

В чём разница между

Разница в том, как мне видится, что исключения в яве используются как возврат ошибки, а не как исключительная ситуация, требующая раскрутки стека. Исключения в яве - это не исключения, это норма.

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

Можно извратиться, но дальше хеловорлда будет сложновато.

В смысле? Берёшь любую программу на не-ООП языке и переписываешь 1-в-1 с static перед каждой функцией.

Я так в институте преподавателя троллил в стиле «настоящий программист может написать программу на Фортране на любом языке».

исключения в яве используются как возврат ошибки, а не как исключительная ситуация, требующая раскрутки стека

Также как и handler-case. И возврат ошибки в любом случае стек раскручивает.

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

Я так в институте преподавателя троллил в стиле «настоящий программист может написать программу на Фортране на любом языке».

Потому и троллил, что это ненормально. К тому же, вся стандартная библиотека - это ООП. А без неё ява - не ява.

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

К тому же, вся стандартная библиотека - это ООП

Статические методы (System.out, System.in, …) — это не ООП. Они не принадлежат объекту.

Если нужен тотальный ООП, надо изучать Smalltalk. Там реально всё объекты, вплоть до конструкции условного вычисления.

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

Статические методы (System.out, System.in, …) — это не ООП. Они не принадлежат объекту.

Стандартная библиотека не ограничивается System.out, System.in

Если нужен тотальный ООП, надо изучать Smalltalk.

«Нет, уж лучше вы к нам» :))

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

Стандартная библиотека не ограничивается System.out, System.in

Естественно. Это был контрпример к утверждению, что она вся ООП. Большей частью ООП. Так она и в C++ большей частью ООП.

monk ★★★★★
()
13 октября 2022 г.
Ответ на: комментарий от monk

Если нужен тотальный ООП, надо изучать Smalltalk. Там реально всё объекты, вплоть до конструкции условного вычисления.

+1

Если что, тут на лоре когда-то анонсировали русскоязычный курс в записях. Не помню только кто это был

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