[obsidian] vault backup: 2024-10-30 17:32:47
	
		
			
	
		
	
	
		
	
		
			All checks were successful
		
		
	
	
		
			
				
	
				Build / build (push) Successful in 3m11s
				
			
		
		
	
	
				
					
				
			
		
			All checks were successful
		
		
	
	Build / build (push) Successful in 3m11s
				
			This commit is contained in:
		@@ -59,20 +59,38 @@ ChuckもボイスごとにShredを生やす方向で対応してるからちょ
 | 
			
		||||
Noteのバインドの記法
 | 
			
		||||
 | 
			
		||||
```rust
 | 
			
		||||
let channel:()->float = bind_midi_note_mono(channel)
 | 
			
		||||
let cell:()->float = bind_midi_note_mono(channel)
 | 
			
		||||
 | 
			
		||||
channel() //値の取り出し
 | 
			
		||||
let (note,vel) = cell(); //値の取り出し
 | 
			
		||||
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
```rust
 | 
			
		||||
//rust
 | 
			
		||||
fn bind_midi_note_mono(vm:&mut Machine)->ReturnCode{
 | 
			
		||||
	let ch = vm.get_stack(0)
 | 
			
		||||
fn bind_midi_note_mono(&mut self ,vm:&mut Machine)->ReturnCode{
 | 
			
		||||
	let ch = Machine::get_as::<f64>(vm.get_stack(0));
 | 
			
		||||
	let cell = Arc::new((AtomicF64::new(),AtomicF64::new() ));
 | 
			
		||||
	self.add_midi_listener(ch,|note,vel|{
 | 
			
		||||
		let (note_c,vel_c) = cell.clone();
 | 
			
		||||
		note_c.write(note);
 | 
			
		||||
		vel_c.write(vel);
 | 
			
		||||
	});
 | 
			
		||||
	let cls = |vm:&mut Machine|->ReturnCode{
 | 
			
		||||
		let (note_c,vel_c) = cell.clone();
 | 
			
		||||
		vm.set_stack(0,Machine::to_value(note_c));
 | 
			
		||||
		vm.set_stack(1,Machine::to_value(vel_c));
 | 
			
		||||
		2
 | 
			
		||||
	}
 | 
			
		||||
	vm::set_stack(0, wrap_rust_closure(cls))
 | 
			
		||||
	1
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
あとは頑張って`add_midi_listener`相当の何かを作ろうって感じだな(関数型っぽくはないけども)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
---
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -209,3 +209,35 @@ fn filterbank (n,filter){ //n:0 filter: 1
 | 
			
		||||
あ、でも`callcls`命令実行の時だけ、最初にgetstateを実行、暗黙的に読み出して、その中身のポインタへ飛べばいいのか
 | 
			
		||||
 | 
			
		||||
Closureを作った時にどうやってstateのメモリを拡張するかというと、ヒープ上のクロージャのデータ構造自体にstateへのポインタを持たせないと無理?
 | 
			
		||||
 | 
			
		||||
---
 | 
			
		||||
 | 
			
		||||
最小限の表現としてはCall(Stateポインタをいじる可能性がある)とCallClsの2種類で対応可能なんだろうけど、最適化を考えると
 | 
			
		||||
 | 
			
		||||
- Call (ほぼ純粋な関数)
 | 
			
		||||
- CallState (後々SelfとかDelayを呼び出しうる関数)
 | 
			
		||||
- CallClosure
 | 
			
		||||
- CallExtFunction
 | 
			
		||||
 | 
			
		||||
ここにTailCallとか加えると、それぞれに一つずつTailCall用の命令が映えるみたいな感じになるのだろうか
 | 
			
		||||
 | 
			
		||||
コンパイル時ifが使える想定として
 | 
			
		||||
 | 
			
		||||
```rust
 | 
			
		||||
call_function<is_tailcall,is_stateful>(&mut self,f:F){
 | 
			
		||||
	ifc !is_tailcall{
 | 
			
		||||
		self.stack.push_return_address();
 | 
			
		||||
	}
 | 
			
		||||
	ifc is_closure{
 | 
			
		||||
		self.stateptr_stack.push(f.state_stack_ptr)
 | 
			
		||||
	}
 | 
			
		||||
	let nret = f(self);
 | 
			
		||||
		ifc is_closure{
 | 
			
		||||
		self.stateptr_stack.pop()
 | 
			
		||||
	}
 | 
			
		||||
	ifc !is_tailcall{
 | 
			
		||||
		self.stack.push_return_address();
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
```
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user