@@ -169,7 +169,23 @@ impl TypeChecker {
169169
170170 fn check_statement ( & mut self , stmt : & Statement ) -> Result < TypedStatement > {
171171 let ty = match stmt {
172- Statement :: Expression ( expr) => self . infer_type ( expr) ?,
172+ Statement :: Expression ( expr) => {
173+ // Check if this is a (define name value) expression
174+ if let Expression :: ToolCall { name, args } = expr {
175+ if name == "define" && args. len ( ) == 2 {
176+ // Extract variable name from first arg
177+ if let Some ( var_name) = self . extract_var_name ( & args[ 0 ] . value ) {
178+ let value_ty = self . infer_type ( & args[ 1 ] . value ) ?;
179+ self . env . define ( & var_name, value_ty. clone ( ) ) ;
180+ return Ok ( TypedStatement {
181+ statement : stmt. clone ( ) ,
182+ ty : value_ty,
183+ } ) ;
184+ }
185+ }
186+ }
187+ self . infer_type ( expr) ?
188+ }
173189
174190 Statement :: Assignment { name, value } => {
175191 let value_ty = self . infer_type ( value) ?;
@@ -255,6 +271,14 @@ impl TypeChecker {
255271 } )
256272 }
257273
274+ /// Extract variable name from Expression::Variable
275+ fn extract_var_name ( & self , expr : & Expression ) -> Option < String > {
276+ match expr {
277+ Expression :: Variable ( name) => Some ( name. clone ( ) ) ,
278+ _ => None ,
279+ }
280+ }
281+
258282 /// Infer the type of an expression
259283 pub fn infer_type ( & mut self , expr : & Expression ) -> Result < OvsmType > {
260284 match expr {
@@ -421,4 +445,23 @@ mod tests {
421445 assert ! ( !OvsmType :: String . is_primitive( ) ) ;
422446 assert ! ( OvsmType :: Array ( Box :: new( OvsmType :: I64 ) ) . is_heap_allocated( ) ) ;
423447 }
448+
449+ #[ test]
450+ fn test_define_creates_binding ( ) {
451+ use crate :: { SExprScanner , SExprParser } ;
452+
453+ let source = "(define x 42)\n x" ;
454+ let mut scanner = SExprScanner :: new ( source) ;
455+ let tokens = scanner. scan_tokens ( ) . unwrap ( ) ;
456+ let mut parser = SExprParser :: new ( tokens) ;
457+ let program = parser. parse ( ) . unwrap ( ) ;
458+
459+ eprintln ! ( "Parsed program: {:?}" , program) ;
460+
461+ let mut checker = TypeChecker :: new ( ) ;
462+ let result = checker. check ( & program) ;
463+
464+ eprintln ! ( "Result: {:?}" , result) ;
465+ assert ! ( result. is_ok( ) , "Should type-check successfully: {:?}" , result) ;
466+ }
424467}
0 commit comments