grgcomm.sl 73 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314
  1. %==========================================================================%
  2. % GRGcomm.sl Main Commands %
  3. %==========================================================================%
  4. % GRG 3.2 Standard Lisp Source Code (C) 1988-97 Vadim V. Zhytnikov %
  5. %==========================================================================%
  6. % This file is distributed without any warranty. You may modify it but you %
  7. % are not allowed to remove author's name and/or distribute modified file. %
  8. %==========================================================================%
  9. %---------- Some General Aux Functions -----------------------------------
  10. % Data name -> Internal variables list ...
  11. (de dgood!> (lst)
  12. (prog (w wa wss)
  13. (setq w lst)
  14. (cond ((eqs!> lst '(all)) (return(alldata!>)))) % word!!!
  15. (setq wss lst)
  16. (setq lst (assocf!> lst ![datl!]))
  17. (cond ((and (null lst) w (null(cdr w)) (idp(car w)))
  18. (progn (setq wa (incomiv!>(explode(car w))))
  19. (cond ((flagp wa '!+ivar) (setq lst (ncons wa)))))))
  20. (cond ((null lst) (progn (setq ![er!] 6030)
  21. (doubl!> wss)
  22. (return !!er!!))))
  23. (setq lst (car lst))
  24. (cond ((atom lst) (setq lst (ncons lst))))
  25. (setq w (constrpl!> lst))
  26. (cond ((eq w !!er!!) (return !!er!!)))
  27. (return lst)))
  28. % Same but for Write Macro Tensors are alowed ...
  29. (de dgoodw!> (lst)
  30. (prog (w wa wss)
  31. (setq w lst)
  32. (cond ((eqs!> lst '(all)) (return(alldata!>)))) % word!!!
  33. (setq wss lst)
  34. (setq lst (assocf!> lst ![datl!]))
  35. (cond ((and (null lst) w (null(cdr w)) (idp(car w)))
  36. (progn (setq wa (incomiv!>(explode(car w))))
  37. (cond ((or (flagp wa '!+ivar) (flagp wa '!+macros2))
  38. (setq lst (ncons wa)))))))
  39. (cond ((null lst) (progn (setq ![er!] 6030)
  40. (doubl!> wss)
  41. (return !!er!!))))
  42. (setq lst (car lst))
  43. (cond ((atom lst) (setq lst (ncons lst))))
  44. (setq w (constrpl!> lst))
  45. (cond ((eq w !!er!!) (return !!er!!)))
  46. (return lst)))
  47. % All existing data variables ...
  48. (de alldata!> nil
  49. (proc (w lst)
  50. (setq lst ![datl!])
  51. (while!> lst
  52. (cond ((and (atom(cadar lst)) (eval(cadar lst)))
  53. (setq w (cons (cadar lst) w))))
  54. (setq lst (cdr lst)))
  55. (setq lst ![abbr!])
  56. (while!> lst
  57. (cond ((eval(car lst)) (setq w (cons (car lst) w))))
  58. (setq lst (cdr lst)))
  59. (return(reversip w))))
  60. % Data variables list modification in correspondence with flags ..
  61. (de altdata!> (w)
  62. (cond ((null w) nil)
  63. ((atom (car w)) (consmem!> (car w) (altdata!>(cdr w))))
  64. ((eval(caar w)) (appmem!> (cdar w) (altdata!>(cdr w))))
  65. (t (altdata!>(cdr w)))))
  66. %----- Commands in `grg.cfg' file ---------------------------------------
  67. % Package ...
  68. (dm package!> (w) (list 'package0!> (list 'quote (cdr w))))
  69. (de package0!> (w)
  70. (prog (ww)
  71. (setq ![lower!] (islowercase!>))
  72. lab
  73. (cond ((null w) (return nil)))
  74. (setq ww (loadpack!> (ncons(car w)) nil))
  75. (cond ((eq ww !!er!!) (prog2 (erm!> ![er!]) (return !!er!!))))
  76. (setq w (cdr w))
  77. (go lab)
  78. ))
  79. % On ...
  80. (dm on!> (w) (list 'on0!> (list 'quote (cdr w))))
  81. (de on0!> (w)
  82. (prog (ww)
  83. (setq ![lower!] (islowercase!>))
  84. lab
  85. (cond((null w)(return nil)))
  86. (setq ww (onoff!> (ncons(car w)) t))
  87. (cond((eq ww !!er!!) (prog2 (erm!> ![er!])(return !!er!!))))
  88. (setq w (cdr w))
  89. (go lab)
  90. ))
  91. % Off ...
  92. (dm off!> (w) (list 'off0!> (list 'quote (cdr w))))
  93. (de off0!> (w)
  94. (prog (ww)
  95. (setq ![lower!] (islowercase!>))
  96. lab
  97. (cond((null w)(return nil)))
  98. (setq ww (onoff!> (ncons(car w)) nil))
  99. (cond((eq ww !!er!!) (prog2 (erm!> ![er!])(return !!er!!))))
  100. (setq w (cdr w))
  101. (go lab)
  102. ))
  103. % Signature ...
  104. (dm signature!> (w) (list 'signature0!> (list 'quote (cdr w))))
  105. (de signature0!> (w)
  106. (proc (wr ww)
  107. (setq ww w)
  108. (while!> ww
  109. (cond ((equal (car ww) '!+) (setq wr (cons 1 wr)))
  110. ((equal (car ww) '!-) (setq wr (cons -1 wr)))
  111. (t (erm!> 9002) (bye)))
  112. (setq ww (cdr ww)))
  113. (setq ![sgn!] (reverse wr))
  114. (setq ![dim!] (length ![sgn!]))
  115. (cond ((lessp ![dim!] 2) (erm!> 9002) (bye)))
  116. (tunedim!>) ))
  117. %----- On ...; and Off ...; commands 20.02.94 -----------------------
  118. (de onoff!> (lst bool)
  119. (proc (w wc wo ww)
  120. (cond ((null lst) (return nil)))
  121. (setq w (memlist!> '!, lst))
  122. (cond ((eq w !!er!!) (prog2 (setq ![er!] 1100) (return !!er!!))))
  123. (while!> w
  124. (setq wc (car w))
  125. (cond
  126. ((or (cdr wc) (not(idp(car wc)))) % bad parameter ...
  127. (prog2 (setq ![er!] 1100) (return !!er!!))) )
  128. (setq wc (idtostcase!> (car wc)))
  129. (cond
  130. ((flagp wc 'switch) % reduce switch ...
  131. (progn
  132. (setq ww (makeswvar!> wc))
  133. (setq wo (eval ww))
  134. (cond((not(equal wo bool))(prog2
  135. (cond
  136. ((iscsl!>)
  137. (cond (bool (eval(list 'on (list 'quote (ncons wc)))))
  138. (t (eval(list 'off (list 'quote (ncons wc)))))))
  139. (t (cond (bool (eval(list '!~on (list 'quote (ncons wc)))))
  140. (t (eval(list '!~off (list 'quote (ncons wc))))))))
  141. (onoff1!> wc bool) ))))) % maybe extra grg tuning ...
  142. ((flagp wc '!+switch) % grg switch ...
  143. (progn
  144. (setq ww (makeswvar!> wc))
  145. (setq wo (eval ww))
  146. (cond((not(equal wo bool))
  147. (onoff1!> wc bool) )) ))
  148. (t(progn % none of above ...
  149. (doub!> wc)(setq ![er!] 6402)(return !!er!!))))
  150. (cond((not(equal wo bool))
  151. (setq ![flaghis!] (cons (cons wc wo) ![flaghis!]))))
  152. (setq w (cdr w)))))
  153. % On/Off GRG switch with tuning ...
  154. (de onoff1!> (w bool)
  155. (progn
  156. (set (makeswvar!> w) bool)
  157. (setq w (get w '!=tuning)) % tuning required ...
  158. (cond(w (apply w (list bool))))))
  159. % On/Off GRG switch without tuning ...
  160. (de onoff2!> (w bool)
  161. (set (makeswvar!> w) bool))
  162. % On/Off GRG switch without tuning but with history ...
  163. (de onoff3!> (w bool)
  164. (prog (ww wo)
  165. (setq ww (makeswvar!> w))
  166. (setq wo (eval ww))
  167. (set ww bool)
  168. (setq ![flaghis!] (cons (cons w wo) ![flaghis!]))))
  169. % Makes *SWITCH from SWITCH ...
  170. (de makeswvar!> (w)
  171. (incom!>(cons '!* (explode2 w))))
  172. % Tuning for TORSION ...
  173. (de tunetorsion!> (bool)
  174. (cond ((and bool (null !*nonmetr)) % Result is Q but N=0
  175. (put '!#!R!I!C '!=sidxl nil)
  176. (put '!#!G!T '!=sidxl nil)
  177. (put '!#!T!D!I '!=sidxl nil)
  178. (put '!#!T!S!F!L '!=sidxl nil)
  179. )
  180. ((and bool !*nonmetr) % Result is Q and N
  181. (put '!#!R!I!C '!=sidxl nil)
  182. (put '!#!G!T '!=sidxl nil)
  183. (put '!#!T!D!I '!=sidxl nil)
  184. (put '!#!T!S!F!L '!=sidxl nil)
  185. )
  186. ((null !*nonmetr) % Result is Q=0 and N=0
  187. (put '!#!R!I!C '!=sidxl '((s 1 2)))
  188. (put '!#!G!T '!=sidxl '((s 1 2)))
  189. (put '!#!T!D!I '!=sidxl '((s 1 2)))
  190. (put '!#!T!S!F!L '!=sidxl '((s 1 2)))
  191. )
  192. ((null !*nonmetr) % Result is Q=0 but N
  193. (put '!#!R!I!C '!=sidxl nil)
  194. (put '!#!G!T '!=sidxl nil)
  195. (put '!#!T!D!I '!=sidxl '((s 1 2)))
  196. (put '!#!T!S!F!L '!=sidxl '((s 1 2)))
  197. )
  198. ))
  199. % Tuning for NONMETR ...
  200. (de tunenonmetr!> (bool)
  201. (cond (bool % Result is N with arbitrary Q
  202. (put '!#!R!I!C '!=sidxl nil)
  203. (put '!#!G!T '!=sidxl nil)
  204. )
  205. (!*torsion % Result is N=0 but Q
  206. (put '!#!R!I!C '!=sidxl nil)
  207. (put '!#!G!T '!=sidxl nil)
  208. )
  209. ((null !*torsion) % Result N=0 and Q=0
  210. (put '!#!R!I!C '!=sidxl '((s 1 2)))
  211. (put '!#!G!T '!=sidxl '((s 1 2)))
  212. )
  213. ))
  214. %----- Stop; command ----------------------------------------------------
  215. (de stop!> nil !!stop!! )
  216. %----- Next; command ----------------------------------------------------
  217. (de next!> nil !!next!! )
  218. %----- Pause; command ---------------------------------------------------
  219. (de pause!> nil
  220. (proc(w)
  221. (cond (![pause!] (return t))
  222. (t (prin2 "Pausing ...") (terpri)
  223. (setq ![pause!] t)))
  224. (loop!> (setq w (runcom!> nil))
  225. (exitif (or (eq w !!stop!!) (eq w !!next!!))))
  226. (setq ![pause!] nil)
  227. (return w)))
  228. %----- Inverse ; command ------------------------------------------------
  229. (de invi!> (lst)
  230. (prog (wa wb)
  231. (cond((null lst)(return nil)))
  232. (setq lst (memlist!> '!, lst))
  233. (cond((or (eq lst !!er!!) (not(eqn(length lst)2)) )
  234. (prog2(setq ![er!] 1100)(return !!er!!))))
  235. (setq wa (car lst))
  236. (setq wb (cadr lst))
  237. (cond((or (cdr wa) (cdr wb) (not(idp(car wa))) (not(idp(car wb))) )
  238. (prog2(setq ![er!] 1100)(return !!er!!))))
  239. (setq wa (car wa))
  240. (setq wb (car wb))
  241. (cond((or (and (not(flagp wa '!+fun)) (not(redgood!> wa)) )
  242. (and (not(flagp wb '!+fun)) (not(redgood!> wb)) ) )
  243. (prog2(setq ![er!] 1100)(return !!er!!))))
  244. (put wa 'inverse wb)
  245. (put wb 'inverse wa)
  246. (return t)))
  247. %----- Order, Factor, RemFac commands -----------------------------------
  248. (de orfare!> (lst wt)
  249. (proc nil
  250. (cond((null lst)(return nil)))
  251. (setq lst(memlist!> '!, lst))
  252. (cond((eq lst !!er!!)
  253. (prog2 (setq ![er!] 2202) (return !!er!!))))
  254. (setq lst (mapcar lst 'translata!>))
  255. (cond((memq !!er!! lst) (return !!er!!)))
  256. (apply wt (list lst))))
  257. %----- Substitutions calls -----------------------------------------------
  258. (de smatch!> nil 'match)
  259. (de famatch!> nil
  260. (cond ((getd 'match00) 'match00)
  261. (t 'match ) ))
  262. (de slet!> nil
  263. (cond ((and (getd '!~let) (not(iscsl!>))) '!~let)
  264. (t 'let ) ))
  265. (de falet!> nil
  266. (cond ((getd 'let00) 'let00)
  267. ((and (getd '!~let) (not(iscsl!>))) '!~let)
  268. (t 'let ) ))
  269. (de sclear!> nil
  270. (cond ((and (getd '!~clear) (not(iscsl!>))) '!~clear)
  271. (t 'clear ) ))
  272. (de faclear!> nil
  273. (cond ((and (getd '!~clear) (not(iscsl!>))) '!~clear)
  274. (t 'clear ) ))
  275. %----- Clear ; command --------------------------------------------------
  276. (de cleri!> (lst wt) % wt=t clear wt=nil for all clear
  277. (proc (w wa wss)
  278. (cond ((null lst) (return nil)))
  279. (setq lst (memlist!> '!, lst))
  280. (cond ((eq lst !!er!!)
  281. (prog2 (setq ![er!] 2202) (return !!er!!))))
  282. (while!> lst
  283. (setq wa (translata!>(car lst)))
  284. (cond((eq wa !!er!!) (return !!er!!))
  285. ((null wa)(prog2(setq ![er!] 8710)(return !!er!!))) )
  286. (setq w (cons wa w))
  287. (setq lst (cdr lst)))
  288. (setq w (reverse w))
  289. (cond ((null wt) % this is for all case returning (clear w)
  290. (return (list (faclear!>) (list 'quote w)))))
  291. (eval (list (sclear!>) (list 'quote w))) % making (clear w)
  292. (while!> w % remembering
  293. (setq wss (list (sclear!>) (ncons(car w))))
  294. (setq ![sublist!] (delete wss ![sublist!]))
  295. (setq w (cdr w)))
  296. (return t)))
  297. %----- Let ; and Match ; commands ---------------------------------------
  298. (de leti!> (lst wt) (letmatchi!> lst wt t))
  299. (de matchi!> (lst wt) (letmatchi!> lst wt nil))
  300. % WW=T - Let, WW=NIL - Match
  301. % WT=T - Execute (Let/Match command), WT=NIL - Form (For All command)
  302. (de letmatchi!> (lst wt ww)
  303. (proc (w wa wl wr wss)
  304. (cond ((null lst) (return nil)))
  305. (setq lst (memlist!> '!, lst))
  306. (cond((eq lst !!er!!)
  307. (prog2 (setq ![er!] 2202) (return !!er!!))))
  308. (while!> lst
  309. (setq wa (seek1!> (car lst) '!=))
  310. (cond
  311. ((null wa)(progn
  312. (cond((not(eq (caar lst) '!S!o!l))
  313. (prog2(setq ![er!] 8709)(return !!er!!))))
  314. (setq wa (soltra!>(car lst)))
  315. (cond((eq wa !!er!!)(return !!er!!)))
  316. (setq w (cons wa w))))
  317. ((or(null(car wa))(null(cdr wa)))
  318. (prog2(setq ![er!] 8709)(return !!er!!)))
  319. (t(progn
  320. (setq wl (translata!>(reverse(car wa))))
  321. (setq wr (translate!>(cdr wa)))
  322. (cond((or(eq wl !!er!!)(eq wr !!er!!)) (return !!er!!))
  323. ((null wl) (prog2(setq ![er!] 8710)(return !!er!!)))
  324. ((and wr(not(zerop(car wr))))
  325. (prog2(setq ![er!] 8711)(return !!er!!))))
  326. (setq w (cons (list 'equal wl (cond(wr(cdr wr))(t 0))) w)))))
  327. (setq lst (cdr lst)))
  328. (setq w (reverse w))
  329. (cond((null wt) % for all case - returning
  330. (return (list (cond (ww (falet!>)) (t (famatch!>)))
  331. (list 'quote w)))))
  332. % let/match case - executing
  333. (cond (ww (eval (list (slet!>) (list 'quote w))))
  334. (t (eval (list (smatch!>) (list 'quote w)))))
  335. (while!> w % remembering
  336. (setq wss (list (sclear!>) (ncons(cadar w))))
  337. (setq ![sublist!] (cons wss (delete wss ![sublist!])))
  338. (setq w (cdr w)))
  339. (return t)))
  340. % Solution Translation ...
  341. (de soltra!> (w)
  342. (cond((or (null(setq w (cdr w))) (cdr w)
  343. (atom(setq w (car w)))
  344. (not(numberp(setq w (car w)))) )
  345. (progn (doub!> '!S!o!l) (setq ![er!] 2020) !!er!!))
  346. (t(soltra1!> w))))
  347. (de soltra1!> (wn)
  348. (cond((null ![sol!]) (prog2 (setq ![er!] 2113) !!er!!))
  349. (t(proc (w wnn)
  350. (setq wnn wn)
  351. (setq w ![sol!])
  352. (while!> (and w (not(zerop wn)))
  353. (setq w (cdr w))
  354. (setq wn (sub1 wn)))
  355. (cond
  356. ((or(null w)(not(zerop wn)))
  357. (progn(doub!> wnn)(setq ![er!] 2114)(return !!er!!)))
  358. ((null(car w))
  359. (progn(setq ![er!] 2115)(return !!er!!))))
  360. (return(mapcar (car w) 'nz!>))))))
  361. %----- For ...; commands ------------------------------------------------
  362. (de forinstrs!> (lst)
  363. (cond
  364. ((null lst) nil)
  365. ((eqs!> (car lst) 'all) (foralli!> (cdr lst))) % word!!! for all ...
  366. ((memqs!> 'print lst) (proc (w) % word!!! for...print...
  367. (while!> (not(eqs!> (car lst) 'print)) % word!!!
  368. (setq w (cons(car lst)w))(setq lst(cdr lst)))
  369. (cond((null(cdr lst))
  370. (prog2(setq ![er!] 6042)(return !!er!!))))
  371. (return(printi!>(append (cdr lst)
  372. (cons 'for % word!!!
  373. (reverse w)))))))
  374. (t(prog2(setq ![er!] 6042) !!er!!))))
  375. %----- For All...; command ----------------------------------------------
  376. (de foralli!> (lst)
  377. (proc (w wt wa wss w1 w2 w3)
  378. (cond((null lst)(return nil))
  379. ((memqs!> 'let lst)(setq wt 'let)) % word!!!
  380. ((memqs!> 'match lst)(setq wt 'match)) % word!!!
  381. ((memqs!> 'clear lst)(setq wt 'clear)) % word!!!
  382. (t(prog2(setq ![er!] 8712)(return !!er!!))))
  383. (while!> lst
  384. (exitif (eqs!> wt (car lst)))
  385. (setq wa(cons(car lst)wa))
  386. (setq lst(cdr lst)))
  387. (cond((or(null lst)(null(cdr lst))(null wa))
  388. (prog2(setq ![er!] 8713)(return !!er!!))))
  389. (setq lst (cdr lst))
  390. (cond((memqs!> 'such wa)(progn % word!!!
  391. (setq wa (reverse wa))
  392. (setq w3 (seek1q!> wa 'such)) % word!!!
  393. (cond((or (null(car w3)) (null(cdr w3)) (null(cddr w3))
  394. (not(eqs!> (cadr w3) 'that))) % word!!!
  395. (prog2(setq ![er!] 8712)(return !!er!!))))
  396. (setq wa (car w3))
  397. (setq w3 (cddr w3)) )))
  398. (setq wa(memlist!> '!, wa))
  399. (cond((eq wa !!er!!)
  400. (prog2 (setq ![er!] 2202) (return !!er!!))))
  401. (while!> wa
  402. (cond((or(cdar wa)(not(idp(caar wa))))
  403. (prog2 (setq ![er!] 8714) (return !!er!!))))
  404. (setq w (cons(caar wa)w))
  405. (setq wa (cdr wa)))
  406. (setq w1 w)
  407. (while!> w1
  408. (cond((not(flagp (car w1) '!+grgvar))
  409. (setq w2 (cons(car w1)w2))))
  410. (setq w1 (cdr w1)))
  411. (flag w '!+grgvar)
  412. (cond((null w3)(setq w3 t))
  413. (t(progn
  414. (setq w3 (booltra!> w3))
  415. (cond((eq w3 !!er!!)(return !!er!!))))))
  416. (setq wa
  417. (cond((eq wt 'let) (leti!> lst nil)) % not words
  418. ((eq wt 'match) (matchi!> lst nil)) % not words
  419. (t (cleri!> lst nil))))
  420. (cond((eq wa !!er!!)
  421. (prog2(remflag w2 '!+grgvar)(return !!er!!))))
  422. (errorset (list 'forall (list 'quote (list w w3 wa)))
  423. ![erst1!] ![erst2!] )
  424. (remflag w2 '!+grgvar)
  425. (setq wa (cadadr wa))
  426. (cond((not(eqs!> wt 'clear)) (setq wa (mapcar wa 'cadr)))) % not word
  427. (while!> wa
  428. (setq wss (list 'forall
  429. (list w w3
  430. (list (faclear!>)
  431. (list 'quote (ncons(car wa)))))))
  432. (setq ![sublist!] (delete wss ![sublist!]))
  433. (cond((not(eq wt 'clear)) % not word
  434. (setq ![sublist!] (cons wss ![sublist!]))))
  435. (setq wa (cdr wa)))
  436. (return t)))
  437. %----- Print...; command ------------------------------------------------
  438. (de printi!> (lst)
  439. (prog (wi)
  440. (cond ((null lst) (return nil)))
  441. (setq ![modp!] ![umod!])
  442. (cond ((not(and (fancyon!>) (not !*latex))) (terpri)))
  443. (cond ((memqs!> 'for lst) (progn % word!!!
  444. (setq lst (seek1q!> lst 'for)) % word!!!
  445. (setq wi (cdr lst))
  446. (setq lst (reverse(car lst))))))
  447. (cond ((null lst) (return nil)))
  448. (cond(wi(setq wi (memlist!> '!, wi))))
  449. (cond((eq wi !!er!!)(prog2(setq ![er!] 2202)(return wi))))
  450. (cond(wi(setq wi (itercon!> wi))))
  451. (cond((eq wi !!er!!)(prog2(setq ![er!] 21031)(return wi))))
  452. (setq ![allzero!] t)
  453. (setq ![extvar!] (mapcar wi 'caar))
  454. % This with prohibited unknown vars -> for
  455. % (setq lst (pretrans!> lst)) % Pre Translation ...
  456. % This with allowed unknown vars -> for
  457. (setq lst (pretransext!> lst)) % pre translation ...
  458. (cond ((and ![extvara!] !*nofreevars)
  459. (mapcar ![extvara!] 'doub!>)
  460. (setq ![er!] 2018)
  461. (setq ![extvara!] nil)
  462. (return !!er!!))
  463. ((and ![extvara!]
  464. (not(and (eqn (length ![extvara!]) 1)
  465. (equal (list 'dummyvar!> (car ![extvara!])) lst))))
  466. (setq wi (mapcar ![extvara!] 'ncons))
  467. (setq wi (mapcar wi 'ncons))
  468. (setq ![extvar!] ![extvara!])
  469. (setq ![extvara!] nil) ))
  470. (cond ((eq lst !!er!!) (return !!er!!)))
  471. (setq lst (printico!> wi nil lst nil))
  472. (cond((eq lst !!er!!)(return !!er!!)))
  473. (cond
  474. (![allzero!]
  475. (progn (alpri!> nil)
  476. (grgend!>)
  477. (grgterpri!>) (terpri)))
  478. ((and (not !*latex) (fancyon!>)) (terpri)))
  479. (return t)))
  480. (de appendn!> (wa wd)
  481. (cond((null wa) wd)
  482. (t(cons(ncons(car wa))(appendn!>(cdr wa)wd)))))
  483. (de printico!> (wi wt lst wp)
  484. (cond
  485. ((null wi) (progn
  486. (setq lst (fintrans!> lst)) % final translation
  487. (cond((eq lst !!er!!) !!er!!)
  488. ((null lst) nil)
  489. (t(progn (setq ![allzero!] nil)
  490. (cond(wt(prinvarl!>(reverse wt))))
  491. (cond(!*math(gprin!> "(")))
  492. (cond
  493. ((zerop(car lst)) (alpri!> (cdr lst))) % algexpr
  494. (t (dfpri!> (cdr lst) (car lst)))) % form
  495. (cond(!*math(gprin!> ")")))
  496. (cond((ifmodo!>)(ooend!>)))
  497. (grgterpri!>)
  498. (cond((not(and (fancyon!>) (not !*latex))) (terpri)))
  499. )))))
  500. (t(proc (wa we)
  501. (setq wa (errorset!> (list3 'itertr!> (list2 'quote (car wi))
  502. (list2 'quote wp) )
  503. ![erst1!] ![erst2!]))
  504. (cond((atom wa)(prog2(setq ![er!] wa)(return !!er!!)))
  505. (t(setq wa(reverse(car wa)))))
  506. (while!> wa
  507. (put (caar wa) '!=subind (cdar wa))
  508. (setq we (printico!> (cdr wi) (cons(cdar wa)wt) lst (cdar wa)))
  509. (remprop (caar wa) '!=subind)
  510. (cond((eq we !!er!!)(return we)))
  511. (setq wa (cdr wa)))))))
  512. (de prinvarl!> (w)
  513. (proc (wr we)
  514. (cond (!*math (setq wr '( !(!* )))
  515. (!*macsyma (setq wr '( !/!* )))
  516. (!*maple (setq wr '( !#! )))
  517. ((or !*grg !*reduce) (setq wr '( !% ))))
  518. (setq we ![extvar!])
  519. (while!> w
  520. (setq wr (cons(car w)(cons '!= (cons(car we)wr))))
  521. (setq w (cdr w))
  522. (cond((and w (fancyon!>)) (setq wr (cons '!, wr))))
  523. (setq we (cdr we)))
  524. (setq wr (cons
  525. (cond (!*math '!*!) )
  526. (!*macsyma '!*!/ )
  527. (!*grg '!;! )
  528. ((fancyon!>) '!: )
  529. % ((fancyon!>) '!:!\! )
  530. (t '!:! )) wr))
  531. (setq wr (reverse wr))
  532. (cond((ifmodo!>) (prog2(gprinwb!> wr)(gterpri!>)))
  533. (t (algprinwb!> wr)))
  534. (cond ((fancyon!>) (algpri!> " ")))
  535. ))
  536. (de itercon!> (lst)
  537. (proc (w wc)
  538. (while!> lst
  539. (setq wc (car lst))
  540. (setq lst (cdr lst))
  541. (cond((or(memq '!< wc)(memq '!> wc)(memq '!<!= wc)(memq '!>!= wc))
  542. (progn (setq wc (itercon1!> wc))
  543. (cond((eq wc !!er!!)(return !!er!!)))
  544. (setq w (append wc w)) ))
  545. (t(setq w (cons(ncons wc)w)))))
  546. (return(reversip w))))
  547. (de itercon1!> (lst)
  548. (proc (w wc wa)
  549. (while!> lst
  550. (cond
  551. ((memq (car lst) '(!< !> !<!= !>!=))
  552. (cond((or(null(cdr lst))(null wa))(return !!er!!))
  553. (t(progn (setq w (cons (cons(reverse wa)wc) w))
  554. (setq wa nil)
  555. (setq wc (itcty!>(car lst)))
  556. (setq lst (cdr lst)) ))))
  557. (t(prog2(setq wa (cons(car lst)wa))
  558. (setq lst (cdr lst))))))
  559. (setq w (cons (cons(reverse wa)wc) w))
  560. (return w)))
  561. (de itcty!> (w)
  562. (cond
  563. ((eq w '!<) 1)
  564. ((eq w '!>) 2)
  565. ((eq w '!<!=) 3)
  566. ((eq w '!>!=) 4)))
  567. %----- Comment ... command -----------------------------------------------
  568. (de comment!> (lst)
  569. (cond (![unl!] (progn
  570. (wrs ![unl!])
  571. (print '(cout!>)) (terpri)
  572. (print (list 'comin!> (list 'quote lst))) (terpri)
  573. (wrs ![wri!]) ))
  574. (t nil)))
  575. %----- Zero/Nullify command ----------------------------------------------
  576. (de zero!> (lst) % 05.96
  577. (proc (w wc)
  578. (cond ((null lst) (return nil))
  579. ((eqs!> lst '(time)) (progn % word!!!
  580. (setq ![time!] (time))
  581. (setq ![gctime!] (gctime))
  582. (return nil))))
  583. (cond ((eq (setq w (dgood!> lst)) !!er!!) (return !!er!!)))
  584. (setq w (altdata!> w))
  585. (while!> w
  586. (setq wc (car w))
  587. (cond ((not (memq wc '(![cord!] ![const!] ![fun!] ![sol!] ![apar!] )))
  588. (cond
  589. ((eq wc '!#!G) (setq ![mtype!] 3) (setq ![dtype!] 1) )
  590. ((eq wc '!#!G!I) (setq ![mitype!] 3) (setq ![ditype!] 1) )
  591. ((eq wc '!#!T) (setq ![ftype!] 3) )
  592. ((eq wc '!#!D) (setq ![fitype!] 3) ) )
  593. (set wc (mkbox!> wc))))
  594. (setq w (cdr w)))))
  595. %----- Forget ; command --------------------------------------------------
  596. (de forget!> (lst)
  597. (proc (w)
  598. (cond ((null lst) (return nil))
  599. ((eq (setq w (dgood!> lst)) !!er!!) (return !!er!!)))
  600. (setq w (altdata!> w))
  601. (while!> w
  602. (cond ((flagp (car w) '!+abbr) (forget1!>(car w)))
  603. (t (msg!> 8701)))
  604. (setq w (cdr w)))))
  605. (de forget1!> (w)
  606. (prog (wa wb wl)
  607. (cond
  608. ((flagp w '!+abbr) (prog2
  609. (setq wb ![abbr!])
  610. (setq ![abbr!]
  611. (loop!>
  612. (cond ((eq w (car wb)) (return (app!> wa (cdr wb))))
  613. (t(prog2 (setq wa (cons (car wb) wa))
  614. (setq wb (cdr wb))))))))))
  615. % (setplist w nil) % AMI: removes ALL properties and flags
  616. (remprop w 'vartype) % PSL: removes GLOBAL/FLUID
  617. (setq wl (ncons w))
  618. (set w nil)
  619. (foreach!> x in ![allflags!] do (remflag wl x))
  620. (foreach!> x in ![allprops!] do (remprop w x))
  621. ))
  622. %-------- Hold/Relese; ---------------------------------------------------
  623. (de hold!> (lst wt)
  624. (prog (w)
  625. (cond ((null lst) (return nil))
  626. ((eq (setq w (dgood!> lst)) !!er!!) (return !!er!!)))
  627. (setq w (altdata!> w))
  628. (cond (wt (flag w '!+hold))
  629. (t (remflag w '!+hold)))
  630. (return t)))
  631. %---------- Erase/Delete; -----------------------------------------------
  632. (de erase!> (lst) % 5.96
  633. (proc (w wc)
  634. (cond ((null lst) (return nil))
  635. ((eq (setq w (dgood!> lst)) !!er!!) (return !!er!!)))
  636. (setq w (altdata!> w))
  637. (while!> w
  638. (setq wc (car w))
  639. (cond ((and ![umod!] (memq wc '(!#!b !#!e))) (msg!> 7012))
  640. ((eq wc '![cord!])
  641. (rempf!> ![rpflcr!] nil) (setq ![cord!] nil))
  642. ((eq wc '![const!])
  643. (rempf!> ![rpflcn!] nil) (setq ![const!] nil))
  644. ((eq wc '![apar!])
  645. (rempf!> ![rpflap!] '(2)) (setq ![apar!] nil))
  646. ((eq wc '![fun!])
  647. (rempf!> ![rpflfu!] '(1)) (setq ![fun!] nil)
  648. (setq ![gfun!] nil) )
  649. (t (set wc nil)))
  650. (cond
  651. ((eq wc '!#!G) (setq ![mtype!] nil) (setq ![dtype!] nil) )
  652. ((eq wc '!#!G!I) (setq ![mitype!] nil) (setq ![ditype!] nil) )
  653. ((eq wc '!#!T) (setq ![ftype!] nil) )
  654. ((eq wc '!#!D) (setq ![fitype!] nil) ) )
  655. (setq w (cdr w)) )
  656. (return t)))
  657. %----- New Commands Driver -----------------------------------------------
  658. (de newcommands!> (w)
  659. (cond ((null w) nil)
  660. ((eqs!> (car w) 'coordinates) (chcoord!> (cdr w))) % word!!!
  661. ((eqs!> (car w) 'object) (obdec!> (cdr w) 0)) % word!!!
  662. ((eqs!> (car w) 'equation) (obdec!> (cdr w) 1)) % word!!!
  663. ((eqs!> (car w) 'connection) (obdec!> (cdr w) 2)) % word!!!
  664. (t (obdec!> w 0))))
  665. %----- Show Commands Driver ----------------------------------------------
  666. (de shcommands!> (w)
  667. (cond ((null w) nil)
  668. ((eqs!> w '(time)) (timei!>)) % word!!!
  669. ((eqs!> w '(status)) (shstatus!>)) % word!!!
  670. ((eqs!> w '(all)) (shall!>)) % word!!!
  671. ((eqs!> w '(gc time)) (gctime!>)) % word!!!
  672. ((eqs!> (car w) 'switch) (sflag!> (cdr w))) % word!!!
  673. ((eqs!> (car w) 'file) (showfil!> (cdr w))) % word!!!
  674. ((memq '!* w) (shallbuilt!> w))
  675. ((stringp (car w)) (showfil!> w))
  676. ((and (null(cdr w)) (idp(car w))
  677. (or (flagp (idtostcase!> (car w)) 'switch)
  678. (flagp (idtostcase!> (car w)) '!+switch)))
  679. (sflag!> w))
  680. (t (showobj!> w))))
  681. %----- Show Object -------------------------------------------------------
  682. (de showobj!> (lst)
  683. (proc (w)
  684. (cond ((null lst) (return nil))
  685. ((eq (setq w (dgoodw!> lst)) !!er!!) (return !!er!!)))
  686. (setq w (altdata!> w))
  687. (cond ((null w) (return nil)))
  688. (while!> w
  689. (cond ((memq (car w) '(![cord!] ![const!] ![fun!] ![sol!] ![apar!]))
  690. nil )
  691. (t (shobj1!> (car w))))
  692. (setq w (cdr w)) )
  693. (terpri)
  694. (return t)))
  695. (de shobj1!> (w)
  696. (prog (wi wt wy ww wc wd wx)
  697. (terpri)
  698. (setq wi (get w '!=idxl))
  699. (setq wt (gettype!> w))
  700. (setq wy (get w '!=sidxl))
  701. (setq ww (get w '!=way))
  702. (setq wd (get w '!=dens))
  703. (gprinreset!>)
  704. (setq ![gptab!] 2)
  705. % Name ...
  706. (cond ((not(or (flagp w '!+abbr) (flagp w '!+macros2))) (thepn!> w)))
  707. % ID ...
  708. (gprin!> (incom!>(cdr(explode2 w))))
  709. % Indices ...
  710. (while!> wi
  711. (setq wc (car wi))
  712. % Position ...
  713. (cond
  714. ((and (upperp!> wc) (holp!> wc)) (gprin!> "^"))
  715. ((upperp!> wc) (gprin!> "'"))
  716. ((holp!> wc) (gprin!> "_"))
  717. (t (gprin!> ".")))
  718. % Type ...
  719. (cond
  720. ((holp!> wc) (gprin!>(car ![wh!])) (setq ![wh!] (cdr ![wh!])))
  721. ((tetrp!> wc) (gprin!>(car ![wf!])) (setq ![wf!] (cdr ![wf!])))
  722. ((enump!> wc) (gprin!>(car ![wi!])) (setq ![wi!] (cdr ![wi!]))
  723. (cond ((cdr wc) (gprin!> (cdr wc)))
  724. (t (gprin!> "dim"))))
  725. ((spinp!> wc) (for!> x (1 1 (cdr wc)) do (progn
  726. (gprin!>(car ![ws!]))
  727. (setq ![ws!] (cdr ![ws!]))))))
  728. (cond ((dotp!> wc) (gprin!> "~")))
  729. (setq wi (cdr wi)))
  730. (gpris!>)
  731. % Type ...
  732. (gprin!> (cond((flagp w '!+pl) "are")(t "is")))
  733. (gpris!>)
  734. (cond ((eqn wt -1) (gprin!> "Vector"))
  735. ((eqn wt 0) (gprin!> "Scalar"))
  736. (t (gprin!> wt) (gprin!> "-form")))
  737. (cond ((flagp w '!+equ) (gpris!>) (gprin!> "Equation"))
  738. ((flagp w '!+fconn) (gpris!>)
  739. (gprils0!> '("Frame" "Connection")))
  740. ((flagp w '!+hconn) (gpris!>)
  741. (gprils0!> '("Holonomic" "Connection")))
  742. ((flagp w '!+uconn) (gpris!>)
  743. (gprils0!> '("Spinor" "Connection")))
  744. ((flagp w '!+dconn) (gpris!>)
  745. (gprils0!> '("Conjugate" "Spinor" "Connection")))
  746. ((flagp w '!+macros2) (gpris!>)
  747. (gprils0!> '("Macro" "Object")))
  748. (wd (gpris!>)
  749. (gprin!> "Density")
  750. (gpris!>)
  751. (cond ((car wd) (gprin!> "sgnD") (setq wx t)))
  752. (cond ((cadr wd) (cond (wx (gprin!> "*")))
  753. (setq wx t)
  754. (gprin!> "D")
  755. (cond ((not(eqn (cadr wd) 1))
  756. (gprin!> "^")
  757. (cond ((lessp (cadr wd) 0) (gprin!> "(")))
  758. (gprin!> (cadr wd))
  759. (cond ((lessp (cadr wd) 0) (gprin!> ")")))
  760. ))))
  761. (cond ((caddr wd) (cond (wx (gprin!> "*")))
  762. (setq wx t)
  763. (gprin!> "sgnL")))
  764. (cond ((cadddr wd) (cond (wx (gprin!> "*")))
  765. (gprin!> "L")
  766. (cond ((not(eqn (cadddr wd) 1))
  767. (gprin!> "^")
  768. (cond ((lessp (cadddr wd) 0) (gprin!> "(")))
  769. (gprin!> (cadddr wd))
  770. (cond ((lessp (cadddr wd) 0) (gprin!> ")")))
  771. ))))
  772. ))
  773. (gterpri!>)
  774. % Value ...
  775. (cond ((flagp w '!+macros2) nil)
  776. ((eval w) (gprin!> "Value: known") (gterpri!>))
  777. (t (gprin!> "Value: unknown") (gterpri!>)))
  778. % Symmetries ...
  779. (cond((null wy) (go lab1)))
  780. (gprinreset!>) (gprin!> " ")
  781. (setq ![gptab!] 4)
  782. (gprin!> "Symmetries:")
  783. (gpris!>)
  784. (while!> wy
  785. (shsy!>(car wy))
  786. (cond((cdr wy) (prog2 (gprin!> ",") (gpris!>))))
  787. (setq wy (cdr wy)))
  788. (gterpri!>)
  789. lab1
  790. % Ways of calculation ...
  791. (setq ww (allways!> ww))
  792. (cond ((null ww) (go lab2)))
  793. (gprinreset!>) (gprin!> " ")
  794. (setq ![gptab!] 4)
  795. (gprin!> "Ways of calculation:")
  796. (gterpri!>)
  797. (while!> ww
  798. (gprinreset!>)
  799. (setq ![gptab!] 6)
  800. (gprin!> " ")
  801. (setq wc (car ww))
  802. (gprils!> (lowertxt!>(car wc)))
  803. (setq wc (cdr wc))
  804. (gprin!> "(")
  805. (while!> wc
  806. (gprin!> (incom!> (cdr (explode2
  807. (cond ((pairp(car wc)) (cadar wc)) (t (car wc))) ))))
  808. (cond((pairp(car wc)) (gprin!> "*")))
  809. (cond ((cdr wc) (gprin!> ",")))
  810. (setq wc (cdr wc)))
  811. (gprin!> ")")
  812. (gterpri!>)
  813. (setq ww (cdr ww)))
  814. lab2
  815. (gprinreset!>)))
  816. (de shsy!> (w)
  817. (cond ((numberp w) (gprin!> w))
  818. ((idp w) (gprin!> (tolc!> w)))
  819. ((idp(car w)) (prog2 (shsy!>(car w)) (shsy!>(cdr w))))
  820. (t(proc nil
  821. (gprin!> "(")
  822. (while!> w
  823. (shsy!> (car w))
  824. (cond((cdr w) (gprin!> ",")))
  825. (setq w (cdr w)))
  826. (gprin!> ")") ))))
  827. (de allways!> (ww)
  828. (proc (wr w)
  829. (while!> ww
  830. (cond((not(eval(cadar ww))) (setq wr (cons (car ww) wr))))
  831. (setq ww (cdr ww)))
  832. (setq ww nil)
  833. (while!> wr
  834. (setq w (needdata!>(cdddar wr)))
  835. (setq w
  836. (cons (cond((null(caar wr)) '( "Standard way" )) (t(caar wr))) w))
  837. (setq ww (cons w ww))
  838. (setq wr (cdr wr)))
  839. (return ww)))
  840. (de needdata!> (w)
  841. (cond ((null w) nil)
  842. ((atom (car w)) (cons (car w) (needdata!> (cdr w))))
  843. ((eq (caar w) t) (cons (car w) (needdata!> (cdr w))))
  844. ((eval (caar w)) (append (cdar w) (needdata!> (cdr w))))
  845. (t (needdata!> (cdr w)))))
  846. %----- Time; and GC Time; commands ---------------------------------------
  847. (de timei!> nil
  848. (prog (wt wgt)
  849. (setq wt (difference (time) ![time!]))
  850. (setq wgt (difference (gctime) ![gctime!]))
  851. (cond ((iscsl!>) (setq wt (plus wt wgt))))
  852. (cond ((not(eqn wt 0)) (setq wgt (quotient (times 100 wgt) wt)))
  853. (t (setq wgt 0)))
  854. (prin2 "Time: ")
  855. (prtime!> wt)
  856. (cond ((zerop wt) (prog2 (terpri) (return nil))))
  857. (prin2 " (")
  858. (prin2 wgt)
  859. (prin2 "%GC)")
  860. (terpri)))
  861. (de gptime!> nil
  862. (prog (wt wgt)
  863. (setq wt (difference (time) ![time!]))
  864. (cond ((iscsl!>) (setq wgt (difference (gctime) ![gctime!]))
  865. (setq wt (plus wt wgt))))
  866. (gprtime!> wt)
  867. (gterpri!>)))
  868. (de gctime!> nil
  869. (progn (prin2 "Garbage collections time: ")
  870. (prtime!> (difference (gctime) ![gctime!])) (terpri)))
  871. (de prtime!> (w)
  872. (prog (wa wb)
  873. (setq wb (quotient (remainder w 1000) 10))
  874. (setq wa (quotient w 1000))
  875. (prin2 wa)(prin2 ".")
  876. (cond((lessp wb 10)(prin2 "0")))
  877. (prin2 wb)
  878. (prin2 " sec")))
  879. (de gprtime!> (w)
  880. (prog (wa wb wt)
  881. (setq wb (quotient (remainder w 1000) 10))
  882. (setq wa (quotient w 1000))
  883. % (gprin!> wa)(gprin!> ".")
  884. % (cond((lessp wb 10)(gprin!> "0")))
  885. % (gprin!> wb)
  886. % (gprin!> " sec")
  887. (setq wt '(! !s !e !c !"))
  888. (setq wt (append (explode2 wb) wt))
  889. (cond((lessp wb 10) (setq wt (cons '!0 wt))))
  890. (setq wt (cons '!. wt))
  891. (setq wt (append (explode2 wa) wt))
  892. (setq wt (cons '!" wt))
  893. (gprin!>(compress wt))
  894. ))
  895. %----- Find/Calculate ; command ------------------------------------------
  896. (de find!> (lst)
  897. (proc (w wa wss)
  898. (cond ((null lst) (return nil)))
  899. (setq w (byfrom!> lst))
  900. (cond ((eq w !!er!!) (return !!er!!)))
  901. (setq wss w)
  902. (cond ((eq(setq w (dgoodw!> w)) !!er!!) (return !!er!!)))
  903. (setq w (altdata!> w))
  904. (while!> w
  905. (cond
  906. ((flagp (car w) '!+macros2)
  907. (doubo!>(car w)) (msg!> 100) (setq w (cdr w)))
  908. ((null(eval(car w))) (progn
  909. (setq ![chain!] nil)
  910. (setq wa (request!>(car w)))
  911. (cond((eq wa !!er!!)
  912. (prog2(trsf!>(car w))(return !!er!!)))
  913. ((null wa)
  914. (progn(setq ![er!] 6046)(trsf!>(car w))(return !!er!!))))
  915. (setq w (cdr w))))
  916. (t (aexp!>(car w)) (setq w (cdr w)))))
  917. (return t)))
  918. % Way extraction ...
  919. (de byfrom!>(w)
  920. (proc(wa) (setq ![way!] nil)
  921. (while!>(and w (not(bftp!>(car w))))
  922. (prog2(setq wa(cons(car w)wa))(setq w(cdr w))))
  923. (cond((or(null wa)(and w(null(cdr w))))
  924. (progn(setq ![er!] 6042)(return !!er!!)))
  925. (w(prog2(setq ![way!] w)(return(reverse wa))))
  926. (t(prog2(setq ![way!] nil)(return(reverse wa)))))))
  927. %---------- Write ...; command -------------------------------------------
  928. (de write!> (lst)
  929. (proc (w wa wc)
  930. (cond ((null lst) (return nil)))
  931. (setq w (tofile!> lst 'write))
  932. (cond((eq w !!er!!) (return !!er!!))
  933. ((null w) % here ends global write to...; command
  934. (progn (closewrite!>) % close old global file ..
  935. (setq ![wri!] ![lwri!])
  936. (setq ![lwri!] nil)
  937. (wrs ![wri!])
  938. (return t)))
  939. (t(progn (setq wc (cdr w)) (setq w (car w))))) % wc=t write...to...;
  940. (cond((eq (setq w (dgoodw!> w)) !!er!!)
  941. (progn (cond(wc(closelw!>)))
  942. (return !!er!!))))
  943. (cond (wc(wrs ![lwri!])))
  944. (setq w (altdata!> w))
  945. (while!> w
  946. (cond((memq (car w) '(!#!b !#!e)) (setq ![modp!] nil))
  947. (t (setq ![modp!] ![umod!])))
  948. (setq wa (dtl!> (car w)))
  949. (cond((eq wa !!er!!) (progn (cond(wc(closelw!>)))
  950. (return !!er!!))))
  951. (setq w(cdr w)))
  952. (cond (wc(closelw!>))) % closing if it is write..to...; command
  953. (return t)))
  954. (de closelw!> nil
  955. (progn (close ![lwri!])
  956. (setq ![lwri!] nil)
  957. (wrs ![wri!]) ))
  958. % Write ; commands for different data types 27.12.90
  959. % General write: if =DATL call special function otherwise Standard ...
  960. (de dtl!> (w)
  961. (cond ((get w '!=datl) (apply 'eval (get w '!=datl)))
  962. (t (datlt!> w))))
  963. % The Standard form of Write command ...
  964. (de datlt!> (wn)
  965. (proc (lst w)
  966. (cond ((flagp wn '!+macros2) (setq lst (prepmac!> wn)))
  967. (t (setq lst (eval wn))))
  968. (cond ((null lst) (prog2 (abse!> wn) (return nil))))
  969. (gprinreset!>) (thepn0!> wn) (gprin!> ":") (gterpri!>)
  970. (cond % write as a matrix ...
  971. ((and !*wmatr (not(ifmodo!>))
  972. (zerop(gettype!> wn))
  973. (eqn (length(get wn '!=idxl)) 2))
  974. (setq ![allzero!] nil)
  975. (alpri!>(cons 'mat lst))
  976. (algterpri!>)
  977. (go lab)))
  978. (cond ((not(and (fancyon!>) (not !*latex))) (terpri)))
  979. (setq ![idwri!] (incom!>(cdr(explode2 wn))))
  980. (setq ![allzero!] t)
  981. (allcom!> lst wn nil (cond ((setq w (get wn '!=idxl)) w)
  982. (t '(0)))
  983. (function printco!>))
  984. lab
  985. (cond
  986. (![allzero!]
  987. (progn (cond ((flagp wn '!+equ) (eqpri!> nil nil 0))
  988. (t (alpri!> nil)))
  989. (grgend!>)
  990. (grgterpri!>) (terpri)))
  991. ((and (not !*latex) (fancyon!>)) (terpri)))
  992. ))
  993. % Prepare values for Macro tensor ...
  994. (de prepmac!> (wn)
  995. (prog (wr)
  996. (setq wr (errorset (list 'require!> (list 'quote (get wn '!=ndl))
  997. nil nil)))
  998. (cond ((atom wr) (return nil)))
  999. (setq wr (mkbox!> wn))
  1000. (setq wr (allcoll!> wr wn nil
  1001. (cond((get wn '!=idxl) (get wn '!=idxl))
  1002. (t '(0)))
  1003. (function prepmac0!>)))
  1004. (return wr)))
  1005. (de prepmac0!> (w wi wn)
  1006. (cond ((syaidxp!> wi (get wn '!=sidxl))
  1007. (setq w (eval (cons (get wn '!=evf) wi)))
  1008. (cond ((eqn (gettype!> wn) 0) (evalalg!> w))
  1009. (t (evalform!> w))))
  1010. (t nil)))
  1011. % One component printing ...
  1012. (de printco!> (we wi wn)
  1013. (prog (wq)
  1014. (cond((null we)(return nil)))
  1015. (setq ![allzero!] nil)
  1016. (setq wq (flagp wn '!+equ)) % equation
  1017. (idwri!> wn wi) % write identifier
  1018. (wriassign!> wq) % write =
  1019. (prel!> we (gettype!> wn) wq) % write value
  1020. (grgends!>)
  1021. (grgterpri!>)
  1022. (cond((not(and (fancyon!>) (not !*latex))) (terpri)))
  1023. ))
  1024. (de idwri!> (wn wi)
  1025. (cond
  1026. ((fancyon!>) (prog (wa w ww wc wss)
  1027. (setq wc 0)
  1028. (cond
  1029. ((setq wa (get wn '!=idxl))
  1030. (setq wss (needspace!> wa)) % we need extra space between indices?
  1031. (foreach!> x in wi do
  1032. (progn
  1033. (setq wc (add1 wc))
  1034. % index ...
  1035. (cond
  1036. ((holonomq1!>(car wa))
  1037. (setq w (getel1!> ![cord!] x)))
  1038. (t (setq w '( !" ))
  1039. (cond ((dotp!>(car wa))
  1040. (setq w (cons (cond (!*latex '!}) (t '!')) w))))
  1041. (setq w (append (explode2 x) w))
  1042. (cond ((and (dotp!>(car wa)) !*latex)
  1043. (setq w (append '(!\ !d !o !t !{) w))))
  1044. (setq w (cons '!" w))
  1045. (setq w (compress w))))
  1046. % place to put index ...
  1047. (cond((eqn wc 1) (setq ww (fancyidwri!> wn)))
  1048. (t (setq ww '!#!#lr)))
  1049. (cond ((and wss (not(eqn wc 1))) (algpri!> "\,")))
  1050. (cond
  1051. ((or (upperp!>(car wa)) (eq wn '!#b))
  1052. (algpri!> (list 'expt ww w) ))
  1053. (t(progn
  1054. (flag (ncons ww) 'print!-indexed)
  1055. (algpri!> (list ww w) )
  1056. (remflag (ncons ww) 'print!-indexed))))
  1057. (setq wa (cdr wa)))))
  1058. (t (algpri!> (fancyidwri!> wn) )) )))
  1059. ((ifmodo!>) (ooelem!> ![idwri!] wi))
  1060. (t(prog (wa wp wss wl wx)
  1061. (algpri!> ![idwri!] )
  1062. (cond((setq wa (get wn '!=idxl))
  1063. (setq wss (needspace!> wa)) % we need extra space between indices?
  1064. (foreach!> x in wi do
  1065. (progn
  1066. (setq wx
  1067. (cond ((holonomq1!>(car wa)) (getel1!> ![cord!] x))
  1068. (t x)))
  1069. (cond (wss (algpri!> " "))) % extra space
  1070. (cond (wss (setq wl (length(explode2 wx))))
  1071. (t (setq wl 1)))
  1072. % vertical position ...
  1073. (setq wp (cond
  1074. ((enump!>(car wa)) 0) % enum
  1075. ((and (upperp!>(car wa)) (dotp!>(car wa))) % upper dot
  1076. (setq ymax!* 2) 1)
  1077. ((upperp!>(car wa)) % upper
  1078. (setq ymax!* 1) 1)
  1079. (t (setq ymin!* -1) -1))) % lower
  1080. % drawing index itself ...
  1081. (setq pline!* (cons
  1082. (cons (cons (cons posn!* (plus wl posn!*))
  1083. wp)
  1084. wx)
  1085. pline!*))
  1086. % dot for dotted index ...
  1087. (cond ((dotp!>(car wa))
  1088. (setq pline!* (cons
  1089. (cons (cons (cons posn!* (add1 posn!*))
  1090. (add1 wp))
  1091. ".")
  1092. pline!*))))
  1093. (setq posn!* (plus wl posn!*))
  1094. (setq wa (cdr wa)) )))) ))))
  1095. (de needspace!> (wi)
  1096. (cond ((null wi) nil)
  1097. ((holonomq1!>(car wi)) t)
  1098. ((greaterp (dimid!>(car wi)) 9) t)
  1099. (t (needspace!> (cdr wi)))))
  1100. (de fancyidwri!> (wn)
  1101. (prog (w)
  1102. (setq w (get wn '!=tex))
  1103. (cond
  1104. (w(prog2
  1105. (put wn 'fancy!-special!-symbol
  1106. (cond ((and (pairp w) !*latex) (car w))
  1107. ((pairp w) (cdr w))
  1108. (t w)))
  1109. (return wn)))
  1110. (t(return ![idwri!])))))
  1111. % Expression or Equality printing ...
  1112. (de prel!> (we wt wq)
  1113. (prog (wl wr)
  1114. (cond(!*math(gprin!> "(")))
  1115. (cond (wq (prog2
  1116. (cond(we(prog2 (setq wl (cadr we))
  1117. (setq wr (caddr we)))))
  1118. (eqpri!> wl wr wt)))
  1119. ((zerop wt) (alpri!> we))
  1120. (t (dfpri!> we wt)))
  1121. (cond(!*math(gprin!> ")"))) ))
  1122. % Special write for Constant and Coordinates ...
  1123. (de datlc!> (wa txt pl)
  1124. (proc nil
  1125. (cond((null wa)(progn(terpri)
  1126. (prin2 txt)
  1127. (cond (pl (prin2 " are absent."))
  1128. (t (prin2 " is absent.")))
  1129. (terpri)
  1130. (return nil))))
  1131. (prin2 txt)
  1132. (prin2 ":")(terpri)(terpri)
  1133. (gprinreset!>)
  1134. (gprils0!> wa)
  1135. (gterpri!>)(terpri)))
  1136. % Special write for Functions ...
  1137. (de funl!> nil
  1138. (prog (w)
  1139. (cond((null ![fun!])(progn
  1140. (prin2 "Functions are absent.")(terpri)
  1141. (return t))))
  1142. (prin2 "Functions:")(terpri)(terpri)
  1143. (gprinreset!>)
  1144. (foreach!> x in ![fun!] do (progn
  1145. (cond((setq w(get x '!=depend)) (gfnpri!> w))
  1146. (t (gprin!> x)))
  1147. (gprin!> '! )))
  1148. (gterpri!>)(terpri)))
  1149. % Special write for Solutions ...
  1150. (de solwri!> nil
  1151. (proc (w wn)
  1152. (cond((null ![sol!])(progn
  1153. (prin2 "Solutions are absent.")(terpri)
  1154. (return t))))
  1155. (prin2 "Solutions:")(terpri)
  1156. (cond((not(and (fancyon!>) (not !*latex))) (terpri)))
  1157. (setq w ![sol!])
  1158. (setq wn 0)
  1159. (while!> w
  1160. (cond
  1161. ((ifmodo!>) (ooelem!> '!S!o!l (ncons wn)))
  1162. (t(progn
  1163. (algpri!> "Sol(" )
  1164. (algpri!> wn )
  1165. (algpri!> ")" ) )))
  1166. (wriassign!> t)
  1167. (prel!> (car w) 0 t)
  1168. (grgends!>)
  1169. (grgterpri!>)
  1170. (cond((not(and (fancyon!>) (not !*latex))) (terpri)))
  1171. (setq wn (add1 wn))
  1172. (setq w (cdr w)))
  1173. (cond((and (fancyon!>) (not !*latex)) (terpri)))
  1174. ))
  1175. %---------- Output ...; command ------------------------------------------
  1176. (de grgout!> (w) (write!> (cons '!> w)))
  1177. %---------- In "..."; command ------------------------------------------
  1178. (de from!> (lst)
  1179. (proc (w wp)
  1180. (cond ((null lst) (return nil))
  1181. ((or(not(stringp(car lst))) (cdr lst))
  1182. (prog2 (setq ![er!] 6301) (return !!er!!))))
  1183. (setq w (grgopeninput!> (car lst)))
  1184. (cond ((atom w) (prog2 (setq ![er!] 6321) (return !!er!!))))
  1185. (setq w (car w))
  1186. (rds w)
  1187. (setq ![echo!] t)
  1188. % (terpri)
  1189. (setq wp (listok!> '( !$ )))
  1190. (setq ![echo!] nil)
  1191. % (terpri)
  1192. (rds nil)
  1193. (close w)
  1194. (cond ((eq wp !!er!!) (return !!er!!)))
  1195. (setq wp (collect!> wp))
  1196. (cond ((eq wp !!er!!) (return !!er!!)))
  1197. (setq wp (mapcar wp 'mklevel!>))
  1198. (setq wp (mapcar wp 'car))
  1199. % execute the commands ...
  1200. (while!> wp
  1201. (cond ((and (car wp) (eq (runcom!>(car wp)) !!stop!!))
  1202. (return !!stop!!)))
  1203. (setq wp (cdr wp)))
  1204. (return t)))
  1205. % Open file ...
  1206. % WD - filename, WI - INPUT/OUTPUT, WB - UNLOAD/WRITE
  1207. (de rdsio!> (wd wi wb)
  1208. (prog (w wf)
  1209. (cond((not(stringp wd))(prog2(setq ![er!] 6301)(return !!er!!))))
  1210. (setq w (errorset (list 'open wd(list 'quote wi)) nil nil))
  1211. (cond((atom w)(prog2(setq ![er!] 6321)(return !!er!!))))
  1212. (cond
  1213. % input file for load ...
  1214. ((eq wi 'input)
  1215. (prog2 (setq ![loa!] (car w)) (rds ![loa!])))
  1216. % output file for write ...
  1217. ((eq wb 'write) (setq ![lwri!] (car w)))
  1218. % output file for unload ...
  1219. ((eq wb 'unload) (setq ![lunl!] (car w)))
  1220. )))
  1221. %---------- Unload ...; command ------------------------------------------
  1222. (de unl!> (lst)
  1223. (proc (w wc wa)
  1224. (cond ((null lst) (return nil)))
  1225. (setq w (tofile!> lst 'unload))
  1226. (cond((eq w !!er!!) (return !!er!!))
  1227. ((null w) (progn % global unload file resetting and quit
  1228. (closeunload!>)
  1229. (setq ![unl!] ![lunl!])
  1230. (setq ![lunl!] nil)
  1231. (return t))) % here ends unload to...; command
  1232. (t(progn (setq wc (cdr w)) (setq w (car w)))))
  1233. (setq wa w)
  1234. (cond((eq (setq w (dgood!> w)) !!er!!)
  1235. (prog2 (cond(wc(closelu!>))) (return !!er!!))))
  1236. (cond (wc (wrs ![lunl!])) (t(wrs ![unl!]))) % directing output ...
  1237. (print '(cout!>)) (terpri)
  1238. (print (list 'sgn!> (list 'quote ![sgn!]))) (terpri)
  1239. (setq w (altdata!> w))
  1240. (cond ((and ![umod!] (eqs!> wa '(all))) (progn % word!!!
  1241. (print '(smt!>)) (terpri)
  1242. (setq w (append '(![dbas!] ![xb!] ![xv!]
  1243. ![xf!] ![ccb!] ![ccbi!]) w)))))
  1244. (while!> w
  1245. (cond ((and (eq (car w) '![cord!]) (null !*unlcord)) nil)
  1246. ((get (car w) '!=unl)
  1247. (apply 'eval (get (car w) '!=unl))
  1248. (cond ((and (eq (car w) '![fun!]) ![gfun!])
  1249. (print (list 'putgfun!> (list 'quote ![gfun!])))
  1250. (terpri))))
  1251. (t(progn
  1252. (cond ((flagp (car w) '!+abbr) (unlnvar!>(car w))))
  1253. (print (list 'setq (car w) (list 'quote (eval(car w)))))
  1254. (terpri) )))
  1255. (setq w (cdr w)))
  1256. (print '(rout!>)) (terpri)
  1257. (cond (wc (closelu!>)) (t (wrs ![wri!]))) % restoring output ...
  1258. (return t)))
  1259. (de closelu!> nil
  1260. (progn (print t)
  1261. (close ![lunl!])
  1262. (setq ![lunl!] nil)
  1263. (wrs ![wri!]) ))
  1264. % Unload new-built data ...
  1265. (de unlnvar!> (w)
  1266. (proc (lst)
  1267. (cond
  1268. ((flagp w '!+abbr) (print (list 'pushabbr!> (list 'quote w)))
  1269. (terpri) ))
  1270. (setq lst ![allflags!])
  1271. (while!> lst
  1272. (unlflag!> w (car lst))
  1273. (setq lst(cdr lst)))
  1274. (setq lst ![allprops!])
  1275. (while!> lst
  1276. (unlprop!> w (car lst))
  1277. (setq lst(cdr lst)))
  1278. ))
  1279. % Unloads flag ...
  1280. (de unlflag!> (w wf)
  1281. (cond ((flagp w wf)
  1282. (print (list 'flag (list 'quote (list w)) (list 'quote wf)))
  1283. (terpri) )))
  1284. % Unloads prop ...
  1285. (de unlprop!> (w wf)
  1286. (prog (wa)
  1287. (cond ((setq wa (get w wf))
  1288. (print (list 'put (list 'quote w)
  1289. (list 'quote wf)
  1290. (list 'quote wa)))
  1291. (terpri) ))))
  1292. %---------- Load ...; command --------------------------------------------
  1293. (de loa!> (lst)
  1294. (proc (w wf we)
  1295. (cond ((null lst) (return nil))
  1296. ((eqs!> (car lst) 'package) % word!!!
  1297. (return (loadpack!> (cdr lst) t)))
  1298. ((not(stringp(car lst)))
  1299. (return (loadpack!> lst t))))
  1300. (setq wf t)
  1301. (cond ((cdr lst) (prog2(setq ![er!] 6301)(return !!er!!))))
  1302. (setq lst (rdsio!> (car lst) 'input nil))
  1303. (cond ((eq lst !!er!!) (return !!er!!)))
  1304. (loop!>
  1305. (setq w (errorset '(read) nil nil))
  1306. (cond ((atom w) % unexpected data
  1307. (progn (cload!>) (setq ![er!] 7720) (return !!er!!)))
  1308. ((or (equal w '(t))
  1309. (equal w (ncons !$eof!$))
  1310. (atom w)) % eof encountered
  1311. (progn (cload!>) (copar!>) (return t)))
  1312. ((and wf (not (equal w '((cout!>))))) % not .loa file format
  1313. (progn (cload!>) (setq ![er!] 7200) (return !!er!!))))
  1314. (setq we (errorset (car w) nil nil))
  1315. (cond ((atom we) % unexpected data
  1316. (progn (cload!>) (setq ![er!] 7720) (return !!er!!))))
  1317. (setq wf nil))
  1318. ))
  1319. (de cload!> nil
  1320. (progn
  1321. (close ![loa!])
  1322. (rds nil)
  1323. (mtype!>)
  1324. (mitype!>)
  1325. (ftype!>)
  1326. (fitype!>)
  1327. ))
  1328. % Basis changing with Load ...
  1329. (de smt!> nil
  1330. (prog2
  1331. (setq ![umod!] t)
  1332. (prin2 "Basis is anholonomic now.")
  1333. (terpri)))
  1334. % Dimension/Signature control with Load ...
  1335. (de sgn!> (w)
  1336. (cond
  1337. ((not(equal w ![sgn!])) % signature diffres
  1338. (cond
  1339. (![firsti!] (setq ![sgn!] w)
  1340. (setq ![dim!] (length w))
  1341. (tunedim!>)
  1342. (sdimsgn!>) )
  1343. (t (erm!> 7900) (err!> 7900))))))
  1344. % Load Comment ...
  1345. (de comin!> (lst)
  1346. (progn (gprinreset!>)
  1347. (gprils0!> (cons "%" lst))
  1348. (gprin!> ";")
  1349. (gterpri!>)
  1350. ))
  1351. %----- Special Load/Unload for Fun, Cord and Const -----------------------
  1352. (dm putpnu!> (u) (list 'putpnu0!> (list 'quote (cdr u))))
  1353. (de putpnu0!> (u)
  1354. (prog (w wc)
  1355. (setq w '(putpn!>))
  1356. (for!> x (0 1 1) do (progn (setq wc (eval(car u)))
  1357. (setq u (cdr u))
  1358. (setq w (cons (list 'quote wc) w))))
  1359. (foreach!> x in u do (setq w (cons (list 'quote x) w)))
  1360. (print(reverse w))
  1361. (terpri) ))
  1362. (de putgfun!> (w)
  1363. (progn
  1364. (loadpack!> '(dfpart) nil)
  1365. (generic!_function w)
  1366. (cond (!*dfpcommute (dfp!_commute w)))))
  1367. (de putpn!> (wd w wf wp wss)
  1368. (proc (wn wa)
  1369. (cond((null w)(return nil)))
  1370. (cond((and (eqn wss 1) !*unlcord)
  1371. (progn (warcor!> w)
  1372. (rempf!> ![rpflcr!] nil)
  1373. (setq ![cord!] w)))
  1374. ((eqn wss 1)(return nil))
  1375. ((eqn wss 2)
  1376. (prog2 (warcon!> w)
  1377. (setq w(setq ![const!](appmem!> w ![const!])))))
  1378. ((eqn wss 3)(progn
  1379. (warfun!> w)
  1380. (setq wa(newid!> w ![fun!]))
  1381. (setq w(setq ![fun!](appmem!> w ![fun!])))
  1382. (operator wa)))
  1383. ((eqn wss 4) (setq ![apar!] w)
  1384. (foreach!> x in ![cord!] do (depend (cons x w)))) )
  1385. (while!> wf
  1386. (flag w (car wf))
  1387. (setq wf(cdr wf)))
  1388. (setq wn 0)
  1389. (while!> w
  1390. (cond(wp(put (car w) wp wn)))
  1391. (setq wn(add1 wn))
  1392. (setq w(cdr w)))
  1393. (cond(wd(foreach!> x in wd do (progn
  1394. (depend x)
  1395. (flag (ncons(car x)) '!+grgvar)
  1396. (put (car x) '!=depend x) ))))
  1397. ))
  1398. (de putfndp!> nil
  1399. (prog (w wa)
  1400. (foreach!> x in ![fun!] do
  1401. (cond((setq wa(get x '!=depend))(setq w(cons wa w)))))
  1402. (return w)))
  1403. (de warcor!> (w)
  1404. (progn
  1405. (cond((and ![cord!](not(equal w ![cord!]))) (msg!> 7630)))
  1406. (cond((intersec!> w ![const!]) (msg!> 7635)))
  1407. (cond((intersec!> w ![fun!]) (msg!> 7637))) ))
  1408. (de warcon!> (w)
  1409. (progn
  1410. (cond((intersec!> w ![cord!]) (msg!> 7631)))
  1411. (cond((intersec!> w ![fun!]) (msg!> 7632))) ))
  1412. (de warfun!> (w)
  1413. (progn
  1414. (cond((intersec!> w ![cord!]) (msg!> 7633)))
  1415. (cond((intersec!> w ![const!]) (msg!> 7634))) ))
  1416. (de intersec!> (wa wb)
  1417. (cond((or(null wa)(null wb)) nil)
  1418. ((memq(car wa)wb) t)
  1419. ((memq(car wb)wa) t)
  1420. (t(intersec!>(cdr wa)(cdr wb)))))
  1421. (de newid!> (w lst)
  1422. (cond((null w) nil)
  1423. ((not(memq(car w)lst))(cons(car w)(newid!>(cdr w)lst)))
  1424. (t(newid!>(cdr w)lst))))
  1425. (de pushabbr!> (w)
  1426. (prog2
  1427. (cond((flagp w '!+abbr) (forget1!> w)))
  1428. (setq ![abbr!] (consmem!> w ![abbr!]))))
  1429. %----- Unload/Write ... To/In file ---------------------------------------
  1430. (de tofile!> (lst wb) % wb=write/unload
  1431. (proc(w)
  1432. (while!>(and lst(not(memqs!> (car lst) '( !> to )))) % word!!!
  1433. (setq w(cons(car lst)w))(setq lst(cdr lst)))
  1434. (cond
  1435. ((and lst(eqn(length lst)2))
  1436. (progn
  1437. (setq lst(rdsio!> (cadr lst) 'output wb))
  1438. (cond((eq lst !!er!!)(return !!er!!)))
  1439. (cond((null w)(return nil)) % just file...
  1440. (t(return(cons(reverse w) t)))))) % file and data...
  1441. (lst(prog2(setq ![er!] 6301)(return !!er!!)))
  1442. (t(return(cons(reverse w) nil)))))) % just data...
  1443. %------ Show File "..."; command -----------------------------------------
  1444. (de showfil!> (lst)
  1445. (proc (w wf wt wss wi wd wx)
  1446. (cond((null lst)(return nil)))
  1447. (setq wf t)
  1448. (cond((cdr lst)(prog2(setq ![er!] 6301)(return !!er!!))))
  1449. (setq lst(rdsio!>(car lst) 'input nil))
  1450. (cond((eq lst !!er!!)(return !!er!!)))
  1451. (loop!>
  1452. (setq w(errorset '(read) nil nil))
  1453. (cond((atom w) % unexpected data
  1454. (progn(cload!>)(setq ![er!] 7720)(return !!er!!)))
  1455. ((or(equal w (ncons !$eof!$))
  1456. (equal w '(t))
  1457. (atom w)) % eof encountered
  1458. (progn(cload!>)(copar!>)(return t)))
  1459. ((and wf(not(equal w '((cout!>))))) % not .loa file format
  1460. (progn(cload!>)(setq ![er!] 7200)(return !!er!!))))
  1461. (setq w (car w))
  1462. (cond((or (null w) (atom w)) nil)
  1463. ((and (pairp w) (null wx) (eq (car w) 'sgn!>))
  1464. (setq wx t) (shsgndim!> (cadadr w)))
  1465. ((eq(car w) 'setq)
  1466. (progn (setq w(cadr w))
  1467. (cond((flagp w '!+ivar)
  1468. (prog2(pn!> w)(gterpri!>)))) ))
  1469. ((eq(car w) 'pushabbr!>)
  1470. (setq w (cadadr w))
  1471. (cond
  1472. ((not (flagp w '!+abbr))
  1473. (setq w (cdr (explode2 w)))
  1474. (mapc w 'prin2)
  1475. (terpri))))
  1476. ((eq (car w) 'comin!>)
  1477. (comin!> (cadadr w)))
  1478. ((eq (car w) 'putpn!>)
  1479. (progn (setq wt (cadadr(cddddr w)))
  1480. (setq w (cadr(caddr w)))
  1481. (algpri!>
  1482. (cond((eqn wt 1) "Coordinates: ")
  1483. ((eqn wt 2) "Constants: ")
  1484. ((eqn wt 3) "Functions: ")) )
  1485. (algprinwb!> w)
  1486. (algterpri!>))))
  1487. (setq wf nil))
  1488. ))
  1489. (de shsgndim!> (w)
  1490. (proc nil
  1491. (prin2 "Dimension is ") (prin2 (length w))
  1492. (prin2 " with Signature (")
  1493. (while!> w
  1494. (cond ((eqn (car w) 1) (prin2 "+"))
  1495. (t (prin2 "-")))
  1496. (cond ((cdr w) (prin2 ",")))
  1497. (setq w (cdr w)))
  1498. (prin2 ")")
  1499. (terpri)))
  1500. %----- Line Length ; command ---------------------------------------------
  1501. (de setlinel!> (lst)
  1502. (cond((null lst) (progn
  1503. (prin2 "Line Length is ")
  1504. (prin2 (linelength nil))
  1505. (prin2 ".")(terpri) ))
  1506. ((or(cdr lst)(not(numberp(car lst)))(lessp(car lst)0))
  1507. (prog2 (setq ![er!] 1100) !!er!!))
  1508. (t(linelength (car lst)))))
  1509. %-------- Show Switch ...; command 20.02.94 ------------------------------
  1510. (de sflag!> (w)
  1511. (prog (wa)
  1512. (cond ((null w) (return nil))
  1513. ((or (cdr w) (not(idp(car w))))
  1514. (prog2 (setq ![er!] 1100) (return !!er!!))) )
  1515. (setq w (idtostcase!> (car w)))
  1516. (cond ((and (not (flagp w 'switch))
  1517. (not (flagp w '!+switch)))
  1518. (progn (setq ![er!] 6402) (doub!> w) (return !!er!!))))
  1519. (setq wa (incom!> (cons '!* (explode2 w))))
  1520. (prin2 w) (prin2 " is ")
  1521. (prin2 (cond ((eval wa) "On.")(t "Off."))) (terpri)
  1522. (return t)))
  1523. %------- Show Status; command 06.94 --------------------------------------
  1524. (de shstatus!> nil % 05.96
  1525. (progn
  1526. % REDUCE version ...
  1527. (prin2 "Running with ")
  1528. (cond ((boundp!> 'version!*) (prin2 (eval 'version!*)))
  1529. (t (prin2 "REDUCE 3.3")))
  1530. (cond ((iscsl!>) (prin2 " [CSL"))
  1531. (t (prin2 " [PSL")))
  1532. (cond ((islowercase!>) (prin2 " Lower-Case]"))
  1533. (t (prin2 " Upper-Case]")))
  1534. (cond ((os!>) (prin2 " under ") (prin2 (os!>))))
  1535. (terpri)
  1536. % System Directory ...
  1537. (cond (![grgdir1!] (progn
  1538. (prin2 "System directory: ")
  1539. (prin2 ![grgdir1!])
  1540. (terpri))))
  1541. % System case ...
  1542. (showcase!>)
  1543. % Dimension and Signature ...
  1544. (sdimsgn!>)
  1545. % Metric ...
  1546. (cond (!#!G (progn
  1547. (prin2 " Metric: ")
  1548. (prin2 (cond ((eqn ![mtype!] 1) "null")
  1549. ((eqn ![mtype!] 2) "diagonal")
  1550. ((eqn ![mtype!] 3) "general")
  1551. (t "unknown type")))
  1552. (prin2 (cond ((and (eqn ![dtype!] 1)
  1553. (not(eqn ![mtype!] 1))) " and constant")
  1554. (t " ")))
  1555. (terpri))))
  1556. % Frame ...
  1557. (cond (!#!T (progn
  1558. (prin2 " Frame: ")
  1559. (prin2 (cond ((eqn ![ftype!] 1) "holonomic")
  1560. ((eqn ![ftype!] 2) "diagonal")
  1561. ((eqn ![ftype!] 3) "general")
  1562. (t "unknown type")))
  1563. (terpri))))
  1564. % Basis ...
  1565. (cond (![umod!] (progn
  1566. (prin2 " Basis: anholonomic")
  1567. (terpri))))
  1568. t))
  1569. (de sdimsgn!> nil % 05.96
  1570. (proc (w)
  1571. (prin2 "Dimension is ") (prin2 ![dim!])
  1572. (prin2 " with Signature (")
  1573. (setq w ![sgn!])
  1574. (while!> w
  1575. (cond ((eqn (car w) 1) (prin2 "+"))
  1576. (t (prin2 "-")))
  1577. (cond ((cdr w) (prin2 ",")))
  1578. (setq w (cdr w)))
  1579. (prin2 ")")
  1580. (terpri)))
  1581. %------- Show All; command -----------------------------------------------
  1582. (de shall!> nil
  1583. (proc (w)
  1584. (setq w (alldata!>))
  1585. (cond ((null w) (progn (prin2 "Nothing is known.")
  1586. (terpri)
  1587. (return nil))))
  1588. (prin2 "Value of the following objects is known:") (terpri)
  1589. (gprinreset!>)
  1590. (while!> w
  1591. (gprin!> " ") (pn0!>(car w)) (gterpri!>)
  1592. (setq w (cdr w))) ))
  1593. (de shallbuilt!> (ww)
  1594. (proc (w wc wn wx)
  1595. (cond ((eq (car ww) '!*) (setq wc nil))
  1596. ((liter (car ww)) (setq wc (tostcase!> (car ww))))
  1597. (t (return nil)))
  1598. (setq w ![datl!])
  1599. (gprinreset!>)
  1600. (while!> w
  1601. (setq wn (car (explode (caaar w))))
  1602. (cond
  1603. ((or (null wc) (eq wc wn))
  1604. (cond ((null wx) (setq wx t)
  1605. (prin2 "Built-in objects:")
  1606. (terpri)))
  1607. (gprin!> " ")
  1608. (gprils0!> (lowertxt!> (caar w)))
  1609. (gterpri!>) ))
  1610. (setq w (cdr w)))
  1611. (cond ((null wx) (prin2 "No such built-in objects.")
  1612. (terpri)))))
  1613. %------- Evaluate ...; command -------------------------------------------
  1614. (de evalcomm!> (w fun) % o5.96
  1615. (proc (we wb wc)
  1616. (cond ((null w) (return nil)))
  1617. (cond ((eq (setq w (dgood!> w)) !!er!!) (return !!er!!)))
  1618. (setq w (altdata!> w))
  1619. (while!> w
  1620. (setq wc (car w))
  1621. (cond((memq wc '(![cord!] ![const!] ![fun!] ![apar!])) nil)
  1622. ((null (setq wb (eval wc))) (abse!> wc))
  1623. (t(set wc
  1624. (allcoll!> wb wc nil
  1625. (cond((get wc '!=idxl)(get wc '!=idxl))
  1626. (t '(0)))
  1627. fun)) ))
  1628. (cond
  1629. ((eq wc '!#!G ) (mtype!>))
  1630. ((eq wc '!#!G!I ) (mitype!>))
  1631. ((eq wc '!#!T ) (ftype!>))
  1632. ((eq wc '!#!D ) (fitype!>)) )
  1633. (setq w (cdr w)))
  1634. (return t)))
  1635. % Evaluation of expression of equality ...
  1636. (de evel!> (lst wi wn)
  1637. (cond((null lst) nil)
  1638. ((and (zerop(gettype!> wn))(not (flagp wn '!+equ)))
  1639. (evalalg!> lst))
  1640. ((and (not(zerop(gettype!> wn)))(not (flagp wn '!+equ)))
  1641. (evalform!> lst))
  1642. ((and (not(zerop(gettype!> wn))) (flagp wn '!+equ))
  1643. (equationf!> (cadr lst) (caddr lst)))
  1644. ((and (zerop(gettype!> wn))(flagp wn '!+equ))
  1645. (equationa!> (cadr lst) (caddr lst)))))
  1646. (de normel!> (lst wi wn)
  1647. (cond((null lst) nil)
  1648. ((and (zerop(gettype!> wn))(not (flagp wn '!+equ)))
  1649. (evalalg!> lst))
  1650. ((and (not(zerop(gettype!> wn)))(not (flagp wn '!+equ)))
  1651. (evalform!> lst))
  1652. ((and (not(zerop(gettype!> wn))) (flagp wn '!+equ))
  1653. (equationf1!> (cadr lst) (caddr lst)))
  1654. ((and (zerop(gettype!> wn))(flagp wn '!+equ))
  1655. (equationa1!> (cadr lst) (caddr lst)))))
  1656. %---------- Package ...; command 25.02.94 --------------------------------
  1657. (de loadpack!> (lst bool) % bool=t - message, bool=nil - silence
  1658. (proc (w ww wu wl)
  1659. (cond
  1660. ((null lst) (return nil))
  1661. ((or (cdr lst) (not(idp(car lst))))
  1662. (setq ![er!] 8100) (return !!er!!)))
  1663. (setq ww (car lst))
  1664. (setq w (explode2 ww))
  1665. (setq wu (incom!> (mapcar w 'touc!>)))
  1666. (setq wl (incom!> (mapcar w 'tolc!>)))
  1667. % already loaded ...
  1668. (cond((or (memq ww (eval 'loaded!-packages!*))
  1669. (memq wu (eval 'loaded!-packages!*))
  1670. (memq wl (eval 'loaded!-packages!*)))
  1671. (cond (bool (msg!> 8101) (return t))
  1672. (t (return t)))))
  1673. % trying name as it is ...
  1674. (setq w (errorset (list 'evload (list 'quote (ncons ww)))
  1675. ![erst1!] ![erst2!]))
  1676. (cond ((not(atom w)) (progn
  1677. (set 'loaded!-packages!* (cons ww (eval 'loaded!-packages!*)))
  1678. (set 'loaded!-packages!* (cons wu (eval 'loaded!-packages!*)))
  1679. (set 'loaded!-packages!* (cons wl (eval 'loaded!-packages!*)))
  1680. (return t))))
  1681. % trying uppercase name ...
  1682. (setq w (errorset (list 'evload (list 'quote (ncons wu)))
  1683. ![erst1!] ![erst2!]))
  1684. (cond ((not(atom w)) (progn
  1685. (set 'loaded!-packages!* (cons ww (eval 'loaded!-packages!*)))
  1686. (set 'loaded!-packages!* (cons wu (eval 'loaded!-packages!*)))
  1687. (set 'loaded!-packages!* (cons wl (eval 'loaded!-packages!*)))
  1688. (return t))))
  1689. % trying lowercase name ...
  1690. (setq w (errorset (list 'evload (list 'quote (ncons wl)))
  1691. ![erst1!] ![erst2!]))
  1692. (cond ((not(atom w)) (progn
  1693. (set 'loaded!-packages!* (cons ww (eval 'loaded!-packages!*)))
  1694. (set 'loaded!-packages!* (cons wu (eval 'loaded!-packages!*)))
  1695. (set 'loaded!-packages!* (cons wl (eval 'loaded!-packages!*)))
  1696. (return t))))
  1697. (setq ![er!] 8102)
  1698. (return !!er!!)))
  1699. %---------- Solve ...; command 16.03.94 ----------------------------------
  1700. (de solvei!> (lst)
  1701. (prog (we wv w wr)
  1702. (setq lst (seek1q!> lst 'for)) % word!!!
  1703. (cond((or(null lst)(null(car lst))(null(cdr lst)))
  1704. (prog2(setq ![er!] 2300)(return !!er!!))))
  1705. (setq wv (memlist!> '!, (cdr lst)))
  1706. (setq we (memlist!> '!, (reverse(car lst))))
  1707. (setq wv (mapcar wv 'solvev!>))
  1708. (cond((memq !!er!! wv)(return !!er!!)))
  1709. (setq we (mapcar we 'solvee!>))
  1710. (cond((memq !!er!! we)(return !!er!!)))
  1711. (setq ![solveq!] nil)
  1712. (solveprep!> we)
  1713. (setq we ![solveq!])
  1714. (setq ![solveq!] nil)
  1715. (cond((null we)(prog2(setq ![er!] 2304)(return !!er!!))))
  1716. (setq w (list 'eval!> (list 'quote
  1717. (list 'solve (cons 'list we) (cons 'list wv)))))
  1718. (setq w (errorset w ![erst1!] ![erst2!]))
  1719. (cond((atom w)(prog2(setq ![er!] 2301)(return !!er!!))))
  1720. (solveres!> (car w))
  1721. (setq wr ![solveq!])
  1722. (setq ![solveq!] nil)
  1723. (cond(wr (setq ![sol!] (append wr ![sol!])))
  1724. (t (msg!> 2302)))
  1725. (return t)))
  1726. (de solvev!> (w) (nz!>(translata!> w)))
  1727. (de solveprep!> (w)
  1728. (cond((atom w) nil)
  1729. ((eq (car w) 'equal)
  1730. (setq ![solveq!] (cons (solveprep1!> w) ![solveq!])))
  1731. (t(mapc w 'solveprep!>))))
  1732. (de solveprep1!> (w) (mapcar w 'nz!>))
  1733. (de solveres!> (w)
  1734. (cond((atom w) nil)
  1735. ((eq (car w) 'equal)
  1736. (setq ![solveq!] (cons (solveres1!> w) ![solveq!])))
  1737. (t(mapc w 'solveres!>))))
  1738. (de solveres1!> (w) (mapcar w 'evalalg!>))
  1739. (de solvee!> (w)
  1740. (cond((memq '!= w)(solveeq!> w))
  1741. (t(prog (ww wi)
  1742. (setq ww (dgood!> w))
  1743. (cond((not(eq ww !!er!!))(return(solveeo!>(altdata!> ww)))))
  1744. (cond
  1745. ((idp(car w))(progn
  1746. (setq wi (explode2(car w)))
  1747. (selid!> wi nil)
  1748. (setq wi (incomiv!> wi))
  1749. (cond((not(flagp wi '!+equ))
  1750. (prog2(setq ![er!] 2300)(return !!er!!))))
  1751. (return(solveeq!>(list '!L!H!S w '!= '!R!H!S w)))))
  1752. (t(prog2(setq ![er!] 2300)(return !!er!!))))))))
  1753. (de solveeq!> (w)
  1754. (proc (wa wr)
  1755. (setq wa (seek1!> w '!=))
  1756. (cond((or(null(car wa))(null(cdr wa)))
  1757. (prog2(setq ![er!] 2300)(return !!er!!))))
  1758. (setq w (list (reverse(car wa)) '!- (cdr wa)))
  1759. (setq ![extvar!] nil)
  1760. (setq w (translate!> w))
  1761. (cond((or(null w)(eq w !!er!!)) (return w)))
  1762. (cond((zerop(car w)) (return(ncons(list 'equal (cdr w) nil)))))
  1763. (setq w (cdr w))
  1764. (while!> w
  1765. (setq wr (cons (list 'equal (caar w) nil) wr))
  1766. (setq w (cdr w)))
  1767. (return wr)))
  1768. (de solveeo!> (w)
  1769. (cond((null w) (prog2 (setq ![er!] 2304) !!er!!))
  1770. (t(proc (wr)
  1771. (while!> w
  1772. (cond((not(flagp (car w) '!+equ))
  1773. (prog2(setq ![er!] 2303)(return !!er!!))))
  1774. (setq ![solveq!] nil)
  1775. (put '![solveq!] '!=typ (gettype!> (car w)))
  1776. (soexp!> (eval(car w)))
  1777. (setq wr (append ![solveq!] wr))
  1778. (setq ![solveq!] nil)
  1779. (setq w (cdr w)))
  1780. (return wr)))))
  1781. (de soexp!> (w)
  1782. (cond((atom w) nil)
  1783. ((eq (car w) 'equal) (soexp1!> w))
  1784. (t (mapc w 'soexp!>))))
  1785. (de soexp1!> (w)
  1786. (cond((zerop(get '![solveq!] '!=typ))
  1787. (setq ![solveq!] (cons w ![solveq!])))
  1788. (t(proc nil
  1789. (setq w (dfsum!> (list (cadr w)
  1790. (chsign!> t (caddr w)))))
  1791. (while!> w
  1792. (setq ![solveq!] (cons (list 'equal (caar w) nil) ![solveq!]))
  1793. (setq w (cdr w)))))))
  1794. %----- Object Declaration Command 11.94, 05.96 --------------------------
  1795. (de obdec!> (lst type) % type=0 object, 1 equation, 2 connection ...
  1796. (cond((null lst) nil) (t
  1797. (proc (wn wt wi wy wd wa wb wc)
  1798. % wn - internal id
  1799. % wt - =type
  1800. % wi - =idxl
  1801. % wy - =sidxl
  1802. % wd - =dens
  1803. (setq wt 0) % default type is scalar ...
  1804. (setq wn (idtra!> (car lst))) % identifier ...
  1805. (cond ((eq wn !!er!!) (return !!er!!))
  1806. ((null(setq lst (cdr lst))) (return
  1807. (formnew!> wn (cond ((eqn type 2) 1) (t wt)) wi wy wd type))))
  1808. % splitting lst into parts ...
  1809. (setq lst (splitparts!> lst))
  1810. (setq wa (car lst)) % indices
  1811. (setq wb (cadr lst)) % type
  1812. (setq wc (caddr lst)) % symmetries
  1813. % indices ...
  1814. (cond ((null wa) (go lab1)))
  1815. (setq wi (indtrac!> wa))
  1816. (cond ((eq wi !!er!!) (setq ![er!] 8602) (return !!er!!)))
  1817. lab1
  1818. % type ...
  1819. (cond ((and (eqn type 2) (null wb)) (setq wt 1)))
  1820. (cond ((null wb) (go lab2)))
  1821. (setq wt (typetrac!> wb))
  1822. (cond ((eq wt !!er!!) (setq ![er!] 8601) (return !!er!!)))
  1823. (setq wd (cdr wt))
  1824. (setq wt (car wt))
  1825. lab2
  1826. % symmetries ...
  1827. (cond ((null wc) (go lab3)))
  1828. (setq wy (symtrac!> wc wi))
  1829. (cond ((eq wy !!er!!) (setq ![er!] 8606) (return !!er!!)))
  1830. lab3
  1831. (return (formnew!> wn wt wi wy wd type)) ))))
  1832. % Forms new object by assigning appropriate flags and props ...
  1833. (de formnew!> (wn wt wi wy wd type) % 05.96
  1834. (proc nil
  1835. (cond
  1836. ((eqn type 2) % connection
  1837. (cond ((not(eqn wt 1)) (setq ![er!] 3002) (return !!er!!)))
  1838. (cond ((equal wi '(t nil)) (flag (ncons wn) '!+fconn)
  1839. (flag (ncons wn) '!+noncov))
  1840. ((equal wi '(1 0)) (flag (ncons wn) '!+hconn)
  1841. (flag (ncons wn) '!+noncov))
  1842. ((equal wi '((u . 2))) (flag (ncons wn) '!+uconn)
  1843. (flag (ncons wn) '!+noncov))
  1844. ((equal wi '((d . 2))) (flag (ncons wn) '!+dconn)
  1845. (flag (ncons wn) '!+noncov))
  1846. ((null wi) (setq wi '(t nil))
  1847. (flag (ncons wn) '!+fconn)
  1848. (flag (ncons wn) '!+noncov))
  1849. (t (setq ![er!] 3001) (return !!er!!)))))
  1850. (global (ncons wn))
  1851. (flag (ncons wn) '!+ivar)
  1852. (flag (ncons wn) '!+abbr)
  1853. (setq ![abbr!] (cons wn ![abbr!]))
  1854. (put wn '!=type wt)
  1855. (cond (wi (put wn '!=idxl wi)))
  1856. (cond (wy (put wn '!=sidxl wy)))
  1857. (cond (wd (put wn '!=dens wd)))
  1858. (cond ((eqn type 1) (flag (ncons wn) '!+equ))) % equation
  1859. (while!> wi
  1860. (cond ((spinp!>(car wi)) (put wn '!=constr '((sp!>)))))
  1861. (setq wi (cdr wi)))
  1862. (return t)))
  1863. % ID translation ...
  1864. (de idtra!> (w) % 05.96
  1865. (prog (we wv)
  1866. (cond
  1867. ((not(idp w)) (prog2 (setq ![er!] 8600) (return !!er!!)))
  1868. ((flagp w '!+grg) (prog2 (doub!> w) (msg!> 8603))))
  1869. (setq we (explode2 w))
  1870. (cond((badchar!> we)
  1871. (progn (doub!> w) (setq ![er!] 8604) (return !!er!!))))
  1872. (setq wv (incomiv!> we))
  1873. (cond
  1874. ((or (flagp wv '!+ivar) (flagp w '!+grgmac) (gettype!> wv))
  1875. (progn (doub!> w) (setq ![er!] 3000) (return !!er!!))))
  1876. (return wv)))
  1877. (de badchar!> (lst) % 05.96
  1878. (cond ((null lst) nil)
  1879. ((or (digit(car lst)) (eq (car lst) '!~)) t)
  1880. (t (badchar!>(cdr lst)))))
  1881. % Split command in parts ....
  1882. (de splitparts!> (lst) % 05.96
  1883. (proc (w wr)
  1884. (while!> (and lst (not (memqs!> (car lst) '(is with)))) % word!!!
  1885. (setq w (cons (car lst) w))
  1886. (setq lst (cdr lst)))
  1887. (setq w (reverse w))
  1888. (cond ((null lst) (return (list w nil nil)))
  1889. ((memqs!> (car lst) '(with)) % word!!!
  1890. (return (list w nil (cdr lst)))))
  1891. (setq lst (cdr lst))
  1892. (setq wr w)
  1893. (setq w nil)
  1894. (while!> (and lst (not (memqs!> (car lst) '(with)))) % word!!!
  1895. (setq w (cons (car lst) w))
  1896. (setq lst (cdr lst)))
  1897. (cond ((null lst) (return (list wr (reverse w) nil)))
  1898. (t (return (list wr (reverse w) (cdr lst)))))
  1899. ))
  1900. % Indices translation ...
  1901. (de indtrac!> (w) % 05.96
  1902. (proc (wr wp wt)
  1903. (cond ((not(zerop(remainder (length w) 2))) (return !!er!!)))
  1904. (while!> w
  1905. (setq wp (car w))
  1906. (cond ((not(memq wp '( !_ !. !' !^ ))) (return !!er!!)))
  1907. (setq wt (cadr w))
  1908. (setq wt (indtra1!> wt wp))
  1909. (cond ((eq wt !!er!!) (return !!er!!)))
  1910. (setq wr (cons wt wr))
  1911. (setq w (cddr w)))
  1912. (return(reversip wr)) ))
  1913. % One index translation ...
  1914. (de indtra1!> (w wp) % 05.96
  1915. (cond
  1916. ((not(idp w)) !!er!!)
  1917. ((get w '!=uc) % single lc letter => holonomic or frame
  1918. (cond ((eq wp '!') t )
  1919. ((eq wp '!.) nil )
  1920. ((eq wp '!^) 1 )
  1921. ((eq wp '!_) 0 )))
  1922. (t(prog (ww wd wl www)
  1923. (setq ww (explode2 w))
  1924. (cond
  1925. ((get (car ww) '!=lc) % spinorial
  1926. (cond ((eq (car(reverse ww)) '!~) (setq wd t)))
  1927. (return (cons
  1928. (cond
  1929. ((memq wp '(!' !^)) (cond (wd 'ud) (t 'uu)))
  1930. (t (cond (wd 'd) (t 'u))))
  1931. (cond
  1932. (wd (sub1(length ww)))
  1933. (t (length ww))))))
  1934. ((get (car ww) '!=uc) % enumerating
  1935. (setq www (compress (cdr ww)))
  1936. (cond
  1937. ((idp www)
  1938. (cond ((equal (cdr ww) '(!d !i !m)) (return '(n)))
  1939. (t (return !!er!!))))
  1940. ((zerop www) (return !!er!!))
  1941. (t (return (cons 'n www)))))
  1942. (t (return !!er!!)))))))
  1943. % Type and Density translation ...
  1944. (de typetrac!> (wb) % 05.96
  1945. (prog (wt wd)
  1946. (setq wb (splitpartsd!> wb))
  1947. (setq wt (typetra1!> (car wb)))
  1948. (setq wd (denstra1!> (cdr wb)))
  1949. (cond ((or (eq wt !!er!!) (eq wd !!er!!)) (return !!er!!))
  1950. (t (return (cons wt wd))))))
  1951. (de splitpartsd!> (lst) % 05.96
  1952. (proc (w)
  1953. (while!> (and lst (not (memqs!> (car lst) '(density)))) % word!!!
  1954. (setq w (cons (car lst) w))
  1955. (setq lst (cdr lst)))
  1956. (setq w (reverse w))
  1957. (cond ((null lst) (return (cons w nil)))
  1958. (t (return (cons w (cdr lst)))))))
  1959. % Type translation ...
  1960. (de typetra1!> (w) % 05.96
  1961. (cond ((null w) 0)
  1962. ((eqs!> w '(vector)) -1) % word!!!
  1963. ((eqs!> w '(scalar)) 0) % word!!!
  1964. ((eqs!> (cdr w) '(!- form)) (pformtra1!>(car w))) % word!!!
  1965. (t !!er!!)))
  1966. (de pformtra1!> (w) % 05.96
  1967. (prog2
  1968. (setq w (ntranslata!> w))
  1969. (cond
  1970. ((eq w !!er!!) !!er!!)
  1971. ((lessp w 0) !!er!!)
  1972. (t w))))
  1973. % Density translation ...
  1974. (de denstra1!> (w) % 05.96
  1975. (proc (w1 w2 w3 w4 wc)
  1976. (cond ((null w) (return nil)))
  1977. (setq w (memlist!> '!* w))
  1978. (cond ((eq w !!er!!) (return !!er!!)))
  1979. (while!> w
  1980. (setq wc (car w))
  1981. (cond
  1982. ((equal wc '(!s!g!n!D)) (setq w1 t))
  1983. ((equal wc '(!s!g!n!L)) (setq w3 t))
  1984. ((equal wc '(!D)) (setq w2 1))
  1985. ((equal wc '(!L)) (setq w4 1))
  1986. ((and (eq (car wc) '!D) (cdr wc) (eq (cadr wc) '!^) (cddr wc))
  1987. (setq wc (ntranslata!>(cddr wc)))
  1988. (cond ((eq wc !!er!!) (return !!er!!)))
  1989. (setq w2 wc))
  1990. ((and (eq (car wc) '!L) (cdr wc) (eq (cadr wc) '!^) (cddr wc))
  1991. (setq wc (ntranslata!>(cddr wc)))
  1992. (cond ((eq wc !!er!!) (return !!er!!)))
  1993. (setq w4 wc))
  1994. (t (return !!er!!)))
  1995. (setq w (cdr w)))
  1996. (cond ((or w1 w2 w3 w4) (return (list w1 w2 w3 w4)))
  1997. (t (return nil)))))
  1998. % Symmetries translation ...
  1999. (de symtrac!> (wy wi) % 05.96
  2000. (cond
  2001. (t(proc (wr w)
  2002. (cond ((eqs!> (car wy) 'symmetries) % word!!!
  2003. (setq wy (cdr wy))))
  2004. (cond ((null wy) (return nil)))
  2005. (setq wy (memlist!> '!, wy))
  2006. (cond ((eq wy !!er!!) (return !!er!!)))
  2007. (while!> wy
  2008. (setq w (symspec1!> (car wy) wi))
  2009. (cond ((eq w !!er!!) (return !!er!!)))
  2010. (setq wr (cons w wr))
  2011. (setq wy (cdr wy)))
  2012. (cond((overlapp!> wr)
  2013. (prog2 (msg!> 8607) (return !!er!!))))
  2014. (return(reversip wr))))))
  2015. % One symmetry item: W = (s ( , , ))
  2016. (de symspec1!> (w wi) % 05.96
  2017. (cond
  2018. ((or (null(cdr w)) (not(memq (car w) '(!a !s !c !h !A !S !C !H)))) !!er!!)
  2019. (t(prog (wt wr)
  2020. (setq wt (tostcase!> (car w)))
  2021. (setq w (symspecl!> (cadr w) wi))
  2022. (cond ((eq w !!er!!) (return !!er!!))
  2023. ((null(cdr w)) (return !!er!!))) % length must be 2 or greater
  2024. (cond
  2025. ((memq wt '(!h !H))
  2026. (cond ((or (not (eqn (length w) 2))
  2027. (not (hequal!> w wi)))
  2028. (return !!er!!))
  2029. (t (return (cons wt w)))))
  2030. ((not(allequal!> w wi)) (return !!er!!))
  2031. (t (return (cons wt w))))))))
  2032. % List of symmetries or indices: W = ( , , )
  2033. (de symspecl!> (w wi) % 05.96
  2034. (proc (wr wa)
  2035. (setq w (memlist!> '!, w))
  2036. (cond ((eq w !!er!!) (return !!er!!)))
  2037. (while!> w
  2038. (setq wa (symspec2!> (car w) wi))
  2039. (cond ((eq wa !!er!!) (return !!er!!)))
  2040. (setq wr (cons wa wr))
  2041. (setq w (cdr w)))
  2042. (return(reversip wr))))
  2043. % General translation ...
  2044. (de symspec2!> (w wi)
  2045. (cond ((cdr w) (symspec1!> w wi)) % something general: s( , )
  2046. ((atom(car w)) (symspec0!> (car w) wi)) % one index: 1
  2047. (t (symspecl!> (car w) wi)))) % list: ( , , )
  2048. % Just one index number ...
  2049. (de symspec0!> (w wi)
  2050. (cond ((and (numberp w) (leq w (length wi))) w)
  2051. (t !!er!!))) % out of range
  2052. (de overlapp!> (wr)
  2053. (proc (w wa)
  2054. (while!> wr
  2055. (setq wa (iron1!>(car wr)))
  2056. (cond ((intersecl!> wa w) (return !!er!!)))
  2057. (setq w (append wa w))
  2058. (setq wr (cdr wr)))
  2059. (return nil)))
  2060. % Forms list of all numbers ...
  2061. (de iron1!> (wr)
  2062. (cond ((null wr) nil)
  2063. ((idp(car wr)) (iron1!>(cdr wr)))
  2064. ((atom(car wr)) (cons (car wr) (iron1!>(cdr wr))))
  2065. (t (append (iron1!>(car wr))
  2066. (iron1!>(cdr wr))))))
  2067. % Replaces ind numbers by their types ...
  2068. (de itypes!> (w wi)
  2069. (cond ((null w) nil)
  2070. ((idp w) w)
  2071. ((numberp w) (getn!> wi w))
  2072. (t (cons (itypes!> (car w) wi) (itypes!> (cdr w) wi)))))
  2073. % All symmetries in the list are identical ...
  2074. (de allequal!> (w wi)
  2075. (cond ((null(cdr w)) t)
  2076. ((equal (itypes!> (car w) wi) (itypes!> (cadr w) wi))
  2077. (allequal!> (cdr w) wi))
  2078. (t nil)))
  2079. (de hequal!> (w wi)
  2080. (prog (w1 w2)
  2081. (setq w1 (itypes!> (car w) wi))
  2082. (setq w2 (cotype!>(itypes!> (cadr w) wi)))
  2083. (return(equal w1 w2))))
  2084. (de cotype!> (w)
  2085. (cond
  2086. ((pairp w)
  2087. (cond
  2088. ((eq (car w) 'u) (cons 'd (cdr w)))
  2089. ((eq (car w) 'd) (cons 'u (cdr w)))
  2090. ((eq (car w) 'uu) (cons 'ud (cdr w)))
  2091. ((eq (car w) 'ud) (cons 'uu (cdr w)))
  2092. (t (mapcar w 'cotype!>))))
  2093. (t w)))
  2094. %========== End of GRGcomm.sl =============================================%