/piclang/hello.ss

http://github.com/ramrunner/sicp-solutions · Scheme · 151 lines · 126 code · 11 blank · 14 comment · 0 complexity · 53bb6216600aba131e4c304f45efb89c MD5 · raw file

  1. (require-extension xlib)
  2. ;(use utils)
  3. (require-extension easyffi)
  4. ;;components for the picture lang
  5. (define (right-split painter n)
  6. (if (= n 0)
  7. painter
  8. (let ((smaller (right-split painter (- n 1))))
  9. (beside painter (below smaller smaller)))))
  10. (define (corner-split painter n)
  11. (if (= n 0)
  12. painter
  13. (let ((up (up-split painter (- n 1)))
  14. (right (right-split painter (- n 1))))
  15. (let ((top-left (beside up up))
  16. (bottom-right (below right right))
  17. (corner (corner-split painter (- n 1))))
  18. (beside (below painter top-left)
  19. (below bottom-right corner))))))
  20. (define (square-limit painter n)
  21. (let ((quarter (corner-split painter n)))
  22. (let ((half (beside (flip-horiz quarter) quarter)))
  23. (below (flip-vert half) half))))
  24. (define (up-split painter n)
  25. (if (= n 0)
  26. painter
  27. (let ((smaller (up-split painter (- n 1))))
  28. (below painter (beside smaller smaller)))))
  29. ;;vectors
  30. (define (make-v x y)
  31. (cons x y))
  32. (define (x-v v)
  33. (car v))
  34. (define (y-v v)
  35. (cdr v))
  36. (define (add-v v1 v2)
  37. (cons (+ (x-v v1) (x-v v2)) (+ (y-v v1) (y-v v2))))
  38. (define (sub-v v1 v2)
  39. (cons (- (x-v v1) (x-v v2)) (- (y-v v1) (y-v v2))))
  40. (define (scl-v v1 n)
  41. (cons (* (x-v v1) n) (* (y-v v1) n)))
  42. ;;frames
  43. (define (make-f o e1 e2)
  44. (list o e1 e2))
  45. (define (orig-f f)
  46. (car f))
  47. (define (e1-f f)
  48. (cadr f))
  49. (define (e2-f f)
  50. (caddr f))
  51. (define (frame-coord-map f)
  52. (lambda (v)
  53. (add-v (scl-v (x-v v)
  54. (e1-f f))
  55. (scl-v (y-v v)
  56. (e2-f f)))))
  57. ;;combining painters
  58. (define (transform-painter painter origin corn1 corn2)
  59. (lambda (frame)
  60. (let ((m (frame-coord-map frame)))
  61. (let ((new-origin (m origin)))
  62. (painter
  63. (make-frame new-origin
  64. (sub-v (m corn1) new-origin)
  65. (sub-v (m corn2) new-origin)))))))
  66. (define (shrink-to-upper-right painter)
  67. (transform-painter painter
  68. (make-vect 0.5 0.5)
  69. (make-vect 1.0 0.5)
  70. (make-vect 0.5 1.0)))
  71. #>
  72. typedef struct {
  73. short a1,a2,b1,b2;
  74. } XSegment;
  75. XSegment *makesegs(int ox ,int oy ,int s1x ,int s1y, int s2x, int s2y){
  76. XSegment *s=(XSegment *) malloc(sizeof(XSegment *)*2);
  77. s[0].a1=ox;
  78. s[0].a2=oy;
  79. s[0].b1=ox+s1x;
  80. s[0].b2=ox+s1y;
  81. s[1].a1=ox;
  82. s[1].a2=oy;
  83. s[1].b1=ox+s2x;
  84. s[1].b2=oy+s2y;
  85. return s;
  86. }
  87. <#
  88. (define kota display)
  89. (let ((display (xopendisplay #f)))
  90. (assert display)
  91. (let* ((screen (xdefaultscreen display))
  92. (root (xrootwindow display screen))
  93. (window (xcreatesimplewindow
  94. display root 100 200 300 50 0
  95. (xblackpixel display screen)
  96. (xwhitepixel display screen))))
  97. (assert window)
  98. (let ((font (xloadfont display "10x20")))
  99. (assert font)
  100. (let ((gc (xcreategc display window 0 #f))
  101. (event (make-xevent))
  102. (depth (xdefaultdepth display screen)))
  103. (let ((painter
  104. (lambda (f)
  105. (xsetforeground display gc (xblackpixel display screen))
  106. (xsetbackground display gc (xwhitepixel display screen))
  107. (xsetfunction display gc GXCOPY)
  108. (xsetfont display gc font)
  109. (xselectinput display window (bitwise-ior EXPOSUREMASK BUTTONPRESSMASK))
  110. (xmapwindow display window)
  111. (xnextevent display event)
  112. (xdrawstring display window gc 100 30 "Paranoia is being computed..." 28)
  113. ;(xdrawrectangle display window gc x y s1 s2)
  114. (define makesegs (foreign-lambda c-pointer "makesegs" int int int int int int))
  115. (kota f)
  116. (let* ((o (orig-f f))
  117. (s1 (e1-f f))
  118. (s2 (e2-f f))
  119. (ox (x-v o))
  120. (oy (y-v o))
  121. (s1x (x-v s1))
  122. (s1y (y-v s1))
  123. (s2x (x-v s2))
  124. (s2y (y-v s2)))
  125. (xdrawsegments display window gc (makesegs ox oy s1x s1y s2x s2y) 2))
  126. ; (letrec ((leloop (lambda (num)
  127. ; (cond ((< num 10)
  128. ; (xdrawarc display window gc x y (/ s1 num) (/ s2 num) 0 (/ 19000 num))
  129. ; ;(xdrawline display window gc (+ x (/ x num)) (+ y (/ y num)) (/ s1 2) (/ s2 2))
  130. ; (if (> num 2)
  131. ; (xdrawrectangle display window gc (+ x (/ s1 num)) (+ y (/ s2 num)) (/ s1 num ) (/ s2 num )))
  132. ; (leloop (+ num 1)))))))
  133. ; (leloop 1))
  134. (xflush display)
  135. (xnextevent display event))))
  136. (let* ((v1 (make-v 30 50))
  137. (v2 (make-v 122 544))
  138. (orig (make-v 355 199))
  139. (lef (make-f orig v1 v2)))
  140. (painter lef) (system "sleep 10")))))))