@@ -74,7 +74,7 @@ func PrimitiveSetup(vm *VirtualMachine) error {
7474 if ! ok {
7575 return EntryError (entry , "requires an address cell" )
7676 }
77- name , err := countedCellsToString (cellAddr . Entry . Word .( * WordForth ). Cells )
77+ name , err := addrToString (cellAddr )
7878 if err != nil {
7979 return JoinEntryError (err , entry , "could not parse name" )
8080 }
@@ -169,7 +169,7 @@ func PrimitiveSetup(vm *VirtualMachine) error {
169169 if ! ok {
170170 return EntryError (entry , "requires an address cell" )
171171 }
172- name , err := countedCellsToString (cellAddr . Entry . Word .( * WordForth ). Cells )
172+ name , err := addrToString (cellAddr )
173173 if err != nil {
174174 return JoinEntryError (err , entry , "could not parse name" )
175175 }
@@ -539,8 +539,13 @@ func PrimitiveSetup(vm *VirtualMachine) error {
539539 },
540540 },
541541 {
542- name : "FIND-WORD" ,
542+ name : "FIND-WORD" , // ( caddr errorIfMissing -- caddr 0 | xt 1 | xt -1 )
543543 goFunc : func (vm * VirtualMachine , entry * DictionaryEntry ) error {
544+ num , err := vm .Stack .PopNumber ()
545+ if err != nil {
546+ return PopError (err , entry )
547+ }
548+ errorIfMissing := num != 0
544549 cell , err := vm .Stack .Pop ()
545550 if err != nil {
546551 return PopError (err , entry )
@@ -549,19 +554,39 @@ func PrimitiveSetup(vm *VirtualMachine) error {
549554 if ! ok {
550555 return EntryError (entry , "requires an address cell" )
551556 }
552- name , err := countedCellsToString (cellAddr . Entry . Word .( * WordForth ). Cells )
557+ name , err := addrToString (cellAddr )
553558 if err != nil {
554559 return JoinEntryError (err , entry , "could not convert input to string" )
555560 }
556561 found , err := vm .Dictionary .FindName (string (name ))
557- if err != nil {
558- return JoinEntryError (err , entry , "could not find name: %s" , name )
562+ missing := err != nil
563+ if missing {
564+ if errorIfMissing {
565+ return JoinEntryError (err , entry , "could not find name: %s" , name )
566+ }
567+ err = vm .Stack .Push (cellAddr )
568+ if err != nil {
569+ return PushError (err , entry )
570+ }
571+ err = vm .Stack .Push (CellNumber {0 })
572+ if err != nil {
573+ return PushError (err , entry )
574+ }
575+ return nil
559576 }
560577 newCell := CellAddress {found , 0 , false }
561578 err = vm .Stack .Push (newCell )
562579 if err != nil {
563580 return PushError (err , entry )
564581 }
582+ ret := - 1
583+ if found .Flag .Immediate {
584+ ret = 1
585+ }
586+ err = vm .Stack .Push (CellNumber {uint16 (ret )})
587+ if err != nil {
588+ return PushError (err , entry )
589+ }
565590 return nil
566591 },
567592 },
@@ -688,7 +713,7 @@ func PrimitiveSetup(vm *VirtualMachine) error {
688713 if ! ok {
689714 return EntryError (entry , "requires a name" )
690715 }
691- name , err := countedCellsToString (cellAddr . Entry . Word .( * WordForth ). Cells )
716+ name , err := addrToString (cellAddr )
692717 if err != nil {
693718 return JoinEntryError (err , entry , "could not parse name" )
694719 }
@@ -2618,7 +2643,7 @@ func parseWord(vm *VirtualMachine, entry *DictionaryEntry) (string, error) {
26182643 if ! ok {
26192644 return "" , EntryError (entry , "name argument needs to be an address to a string" )
26202645 }
2621- name , err := countedCellsToString (cellAddr . Entry . Word .( * WordForth ). Cells )
2646+ name , err := addrToString (cellAddr )
26222647 if err != nil {
26232648 return "" , JoinEntryError (err , entry , "could not parse name" )
26242649 }
@@ -2638,7 +2663,7 @@ func parseAssembly(vm *VirtualMachine, entry *DictionaryEntry) ([]string, error)
26382663 }
26392664 switch c := cell .(type ) {
26402665 case CellAddress :
2641- substr , err := countedCellsToString ( c . Entry . Word .( * WordForth ). Cells )
2666+ substr , err := addrToString ( c )
26422667 if err != nil {
26432668 return nil , JoinEntryError (err , entry , "could not convert input to string" )
26442669 }
0 commit comments