This commit is contained in:
Logen Kain 2020-10-09 21:13:59 -04:00
commit 7821596c57
13 changed files with 7357 additions and 0 deletions

143
notes.lisp Normal file
View File

@ -0,0 +1,143 @@
rlwrap -- helps deal with readline
rlwrap sbcl -- makes it so I have history and navigation
Functions shoudl be verbs -- clear-screen
variables should be nouns -- dog
globals should be surround with asterisks --
*some-global-var*
It should be rare to have more than one expression in a function.
Instead of using variables, like we do in other languages, we should instead nest functions.
For exampe, in python we may do something like this:
;;; Python
def addTwoNumbers(x, y):
sum = x + y
return sum
sum = addTwoNumbers(1, 3)
print(sum)
;;; Lisp
(defun addTwoNumbers(x y)
(+ x y))
(print
(addTwoNumbers(1 3)))
Of course, the python one could simply be "return x + y" but the point is to
show the normal differences in thought, not to say that it's not possible
to do it in a lispy way in python.
To copy an example in only lisp to show the differenes from
cs.gmu.edu/~sean/lisp/LispTutorial.html
;;; Declaritive style (I.E. the python way above)
(defun my-equation (n)
(let (x y z)
(setf x (sin n))
(setf y (cos n))
(setf z (* x y))
(+ n z)))
;;; Functional style
(defun my-equation (n)
(+ n (* (sin n) (cos n))))
As we can see, we avoid variables and make it look pretty
;; Closure example:
;; So what happens here? All of these functions get to share the "account" var
;; yet, "account" is not asseble outside the functions.
;; Since the functions are there, the let statement doesn't get garbage
;; collected?
;; In a manner of speaking, defining functions within a let statement
;; allows for a private global variable
;; not much different from a java or C++ object
(let ((account 0))
(defun deposit ($$$)
(setf account (+ account $$$)))
(defun withdraw ($$$)
(setf account (- account $$$)))
(defun amount ()
account))
;; grabbing an element from a sequence (i.e. not multi-dimentional array)
;; Generic
(elt "hello world" 4)
(elt '(yo 1 3 4) 2)
(elt #(yo yo dur cob so 2 3) 3)
;; String
(aref "hi there" 3)
;; list
(nth 3 '(1 2 3 4 5 6 7))
;; simple-vector
(svref #(d 1 3 f g e) 4)
;; P-Lists (property lists)
(setf my-list '(armor (head
(dragon helmet)
legs ()
arms ())
weapon (left
(wooden-shield)
right ())
ring (left
()
right ())))
(getf my-list 'armor) >> (HEAD LEGS ARMS)
(getf (getf my-list 'armor) 'head)
;; Let's make it less crazy
(defun equipted-helmet (my-list)
(getf (getf my-list 'armor) 'head))
;; doing something like (setf (equipted-helmet my-list) 'hammer) doesn't
;; seem to work. Perhaps a closure would be better
(let ((equipment '(armor (head
(dragon helmet)
legs ()
arms ())
weapon (left
(wooden-shield)
right ())
ring (left
()
right ()))))
(defun get-armor()
(getf equipment 'armor))
(defun get-helmet()
(getf (get-armor) 'head))
(defun change-helmet ()
(push (getf (getf equipment 'armor) 'head) x))
;;(setf (getf (getf equipment 'armor) 'head) x))
#| Etc... |# )
Why doesn't this work?
(defvar mylist '(j 1 v 2))
;; Works
(setf (getf mylist 'j) 3)
(defun get-j ()
(getf mylist `j))
;;doesn't work
(setf (get-j) 'j)

1757
quicklisp.lisp Normal file

File diff suppressed because it is too large Load Diff

26
test.lisp Normal file
View File

@ -0,0 +1,26 @@
(let ((equipment '(armor (head
(dragon-helmet)
legs (empty)
arms (empty))
weapon (left
(wooden-shield)
right (empty))
ring (left
(empty)
right (empty)))))
(defun get-armor()
(getf equipment 'armor))
(defun get-helmet()
(getf (get-armor) 'head))
(defun get-legs()
(getf (get-armor) 'legs))
(defun get-arms()
(getf(get-armor) 'legs))
(defun change-helmet (helmet)
"Useage: (change-helmet 'god-helmet"
(setf (car (get-helmet)) helmet))
(defun change-legs (legs)
(setf (car (get-legs)) legs))
(defun change-arms (arms)
(setf (car (get-arms)) arms)))

5
tktest/README Normal file
View File

@ -0,0 +1,5 @@
Make sure TK is installed. In mint I was able to:
tux i wish
Other distros may require TK since apt switched to package TK from WISH

7
tktest/build-script.sh Executable file
View File

@ -0,0 +1,7 @@
#!/bin/sh
sbcl --eval "(progn
(compile-file \"ltk\")
(load \"ltk\")
(compile-file \"hello-world\")
(load \"hello-world\")
(save-lisp-and-die \"hello-world.core\"))"

16
tktest/example.lisp Normal file
View File

@ -0,0 +1,16 @@
(defpackage :hello-world
(:use :common-lisp 'ltk)
(:export #:main))
(in-package :hello-world)
(defun main ()
(setf *debug-tk* nil)
(with-ltk ()
(let ((b (make-instance
`button
:text "Hello World!"
:command (lambda ()
(do-msg "Bye!")
(setf *exit-mainloop* t)))))
(pack b))))

BIN
tktest/hello-world.core Normal file

Binary file not shown.

BIN
tktest/hello-world.fasl Normal file

Binary file not shown.

16
tktest/hello-world.lisp Normal file
View File

@ -0,0 +1,16 @@
(defpackage :hello-world
(:use :common-lisp ltk)
(:export #:main))
(in-package :hello-world)
(defun main ()
(setf *debug-tk* nil)
(with-ltk ()
(let ((b (make-instance
`button
:text "Hello World!"
:command (lambda ()
(do-msg "Bye!")
(setf *exit-mainloop* t)))))
(pack b))))

BIN
tktest/ltk.fasl Normal file

Binary file not shown.

5342
tktest/ltk.lisp Normal file

File diff suppressed because it is too large Load Diff

4
tktest/run-script.sh Executable file
View File

@ -0,0 +1,4 @@
#!/bin/sh
sbcl --core hello-world.core --noinform\
--eval "(progn (hello-world:main) (quit))"

41
tktest/tk-test.lisp Normal file
View File

@ -0,0 +1,41 @@
(load "~/quicklisp/setup.lisp")
(ql:quickload :ltk)
(use-package :ltk)
(defun clear-screen()
"Clears the screen in Linux"
(sb-ext:run-program "clear"
'()
:output *standard-output*
:search t
:wait t))
(defun echo-durr()
"Print to term"
(sb-ext:run-program "echo"
'("durr")
:output *standard-output*
:search t
:wait t))
(with-ltk ()
(let ((button (make-instance 'button
:text "hello"
:command (lambda ()
(clear-screen))))
(button2 (make-instance 'button
:text "durr"
:command (lambda ()
(echo-durr))))
;; Format doesn't seem to work until the gui ends
(button3 (make-instance 'button
:text "try format"
:command (lambda ()
(format *standard-output*
"hi"))))
(scroller (make-instance 'scrollbar
)))
(grid button 0 0)
(grid button2 0 1)
(grid button3 0 5)
))